2014-03-07 61 views
2

我正在使用ASP.Net MVC4(Razor)。我有以下代码:MVC模型不绑定到字典

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字典为空。模型绑定很好,因为模型中的其他属性仍然返回。

任何想法?

感谢, 大教堂

+0

看来你在OccasionObject上使用FirstOrDefault,是不是字典'Dictionary >'而不是'Dictionary '? – Rui

回答

2

模型绑定对待字典作为一个集合,如果你想像字典作为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描述模型绑定到集合的另一个资源。

+0

真棒文章。说得通。我会让你知道,如果这个工程一旦我试过了。 – devza

+0

@ user422596你是否设法让它起作用? – Rui