C#MVC4绑定数组作为嵌套类型

时间:2015-08-06 22:55:55

标签: c# asp.net-mvc-4

我有一个看起来像这样的模型

 public class ViewModel
 {
    public Dictionary<int, int[]> SelectedRoomIds 
 } 

在我的页面上,我有类似的内容

@foreach(var floor in floors)
{
        @Html.Hidden("SelectedRoomIds.Index", floor)
        @Html.Hidden("SelectedRoomIds[" + floor + "].Key", floor)
        @Html.ListBox("SelectedRoomIds[" + floor + "].Value", Model.FloorSelectList)
}

如果在列表框的任何中选择了至少一个项目,则可以很好地工作(绑定),但是如果没有选择任何内容,它会抛出一个我似乎无法陷阱的异常。如果没有选择任何内容,我希望密钥存在null int数组或整个字典为null。情况也不是这样。任何建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

当没有为特定键发布值时,MVC 4默认模型绑定器似乎抛出了无效的强制转换异常,对于通用字典值中的任何数组类型都存在此问题,其中表单上未发布任何值,它是一个字符串[]或对象[]。

我还没有时间深入研究MVC 4源代码,问题是修复了MVC 5 ,如果你可以升级那么,如果没有你可以创建自己的模型绑定器来处理问题,如果你没有时间这样做,你可以尝试下面的操作并将你的int数组更改为可以为空的int数组:

public Dictionary<int, int?[]> SelectedRoomIds { get; set; }

并在您的选择列表中添加一个空值占位符,它将起作用,只有副作用是您的数组中始终有一个空项:

@Html.Hidden("SelectedRoomIds.Index", floor)
@Html.Hidden("SelectedRoomIds[" + floor + "].Key", floor)
@Html.Hidden("SelectedRoomIds[" + floor + "].Value", "")
@Html.ListBox("SelectedRoomIds[" + floor + "].Value", Model.FloorSelectList)

为了使字典更容易使用,您可以创建一个支持字段并添加一个getter来从字典值中删除所有空值。