我有一个看起来像这样的模型
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。情况也不是这样。任何建议都非常感谢。
答案 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来从字典值中删除所有空值。