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

C#MVC4绑定数组作为嵌套类型,c#,asp.net-mvc-4,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)

我有一个像这样的模型

 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。情况也并非如此。如有任何建议,我们将不胜感激

MVC 4默认模型绑定器似乎会在未为特定键发布值时引发无效强制转换异常,对于通用字典值中的任何数组类型都存在此问题,其中表单上未发布值,无论是字符串[]还是对象[]

我还没有时间深入研究MVC 4源代码,这个问题在MVC 5中得到了解决,如果您可以升级,那么您可以创建自己的模型绑定器来解决这个问题,如果您没有时间,那么您可以尝试以下操作,并将您的int数组更改为可为null的int数组:

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

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

很抱歉,我使用的是mvc 5,我想问题已经在5中解决了,我在mvc 4中重现了一个问题。这是一个可能的解决方案,确实有效,因此我将其标记为答案。我选择使用通过其他问题找到的自定义模型活页夹,并进行了一些修改,使其适合我的需要。
@Html.Hidden("SelectedRoomIds.Index", floor)
@Html.Hidden("SelectedRoomIds[" + floor + "].Key", floor)
@Html.Hidden("SelectedRoomIds[" + floor + "].Value", "")
@Html.ListBox("SelectedRoomIds[" + floor + "].Value", Model.FloorSelectList)