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

本文关键字:嵌套类型 数组 MVC4 绑定 | 更新日期: 2023-09-27 18:06:41

我有一个像这样的模型

 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数组或整个字典为空。事实并非如此。任何建议都非常感谢。

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

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来从字典值中删除所有空值。