【问题标题】:MVC model not binding to dictionaryMVC 模型未绑定到字典
【发布时间】:2014-04-10 12:29:37
【问题描述】:

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

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

key 是场合的类别的字符串。场合对象有 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 中手动检查的复选框。但是,当我将此模型发布回服务器时,occurrenceList 字典为空。模型绑定良好,因为模型中的其他属性仍然返回。

有什么想法吗?

谢谢, 多姆

【问题讨论】:

  • 您似乎在 OccasionObject 上使用 FirstOrDefault,字典不是 Dictionary<string, IEnumerable<OccasionObject>> 而不是 Dictionary<string, OccasionObject>?

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


【解决方案1】:

模型绑定器将字典视为一个集合,如果您将字典想象为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" ../>

所以钥匙不见了。

试试这个:

@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 描述模型绑定到集合的另一个资源。

【讨论】:

  • 很棒的文章。说得通。一旦我尝试过,我会告诉你这是否有效。
猜你喜欢
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
相关资源
最近更新 更多