MVC模型没有绑定到字典

时间:2014-03-07 11:21:59

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

我正在使用ASP.Net MVC4(Razor)。我有以下代码:

Dictionary<string, OccasionObject> occasionList = new Dictionary<string, OccasionObject>()

键是场合类别的字符串。 occassion对象有3个属性:isAttending(bool)ID(int)Name(string)

在我的cshtml文件中,我执行以下操作:

@foreach(string s in model.occasionList .Keys)
{
   foreach(var o in model.occasionList .Keys[s])
   {
      @Html.CheckBoxFor(m=>m.occasionList[s].FirstOrDefault(ev=>ev.ID == o.ID).isAttending);
   }
}

这完全绑定了加载,我在SQL中手动检查的复选框。但是,当我将此模型POST回服务器时,occasionList字典为空。该模型绑定正常,因为我仍然返回模型中的其他属性。

有什么想法吗?

谢谢, DOM

1 个答案:

答案 0 :(得分:3)

模型绑定器将字典视为集合,如果您将字典想象为IEnumerable<KeyValuePair<string, IEnumerable<OccasionObject>>>,则很容易理解为什么它不受约束。

@Html.CheckBoxFor(m=>m.occasionList[s].FirstOrDefault(ev=>ev.ID == o.ID).isAttending);产生的是:

<input type="checkbox" name="occasionList[0].Value.isAttending" ../>

所以Key丢失了。

试试这个:

@Html.Hidden("occasionList.Index", s)
@Html.CheckBoxFor(m=>m.occasionList[s].FirstOrDefault(ev=>ev.ID == o.ID).isAttending);
@Html.HiddenFor(m=>m.occasionList[s].Key)

第一个隐藏是因为您可能会使索引无序,and explicitly providing an ".Index"是在这种情况下使模型绑定器工作的唯一方法。

Here's另一个描述模型绑定到集合的资源。