2014-02-13 50 views
1

我有一个从视图模型填充的视图,其中一个属性是复杂类型的集合。视图正确呈现,列表正在迭代到一个表中,每个项目还没有被选中。当我提交表单时,我无法将对象列表返回到模型中,我无法弄清楚我做错了什么。集合中的每个项目被添加到如下的观点:集合不在模型中返回

@for (int i = 0; i < Model.Items.Count; i++ 
    var rowClass = "selectRow"; 

    if (item.IsSelected) 
    { 
     rowClass = "success"; 
    } 


    <tr class="@rowClass"> 
     @Html.HiddenFor(m => m.Items[i].PropertyOne) 
     <td> 
      @Html.DisplayFor(m => m.Items[i].PropertyTwo) 
     </td> 
     <td class="actions"> 
      // only those items not previously selected need a radio button 
      @if (item.IsSelected == false) 
      { 
       @Html.RadioButtonFor(m => m.Items[i].IsSelected, m.Items[i].PropertyOne, new { id = "IsSelected_" + m.Items[i].PropertyOne }) 
      } 
     </td> 
    </tr> 
} 

我已经使用@ Html.HiddenFor(X => x.PropertyOne)尝试,但我不能选择的值的集合结合回到模型。我可以使用隐藏字段返回模型中的所有其他内容,但我不知道如何解决此问题。任何帮助表示赞赏。

感谢

+0

找出这里发生了什么的最好方法是查看发布时线路上有哪些Model.Items。你使用过提琴手吗? http://www.telerik.com/fiddler。还是FireBug? –

回答

2

如果你想收藏正确张贴到模型绑定,您不能使用foreach循环(除非您使用EditorFor,见注释)。你必须使用一个好的老式for循环,并从IList派生你的收藏。查看我的问题和答案here了解更多信息。

此外,您要发布的集合对象类型的任何属性,您需要确保它在循环中使用。所以,说你Item类看起来是这样的:

public class Item 
{ 
    public int ItemId { get; set; } 
    public string ItemDescription { get; set; } 
    public bool IsSelected { get; set; } 
} 

...你的循环可能是这样的:

@for(var i = 0;i < Model.Items.Count; i++) 
{ 
    <tr> 
     @Html.HiddenFor(m => Model.Items[i].ItemId) 
     <td> 
      @Html.TextBoxFor(m => Model.Items[i].Description) 
     </td> 
     <td> 
      @Html.CheckBoxFor(m => Model.Items[i].IsSelected) 
     </td> 
    </tr> 
} 

同样重要的是要注意,只是显示模型属性不会后它。意思是说......

@Model.Items[i].Description 

...将不会发布,但掩藏它或HTML元素使用它......

@Html.HiddenFor(m => Model.Items[i].Description) 

将发布并正确绑定。

从菲尔哈克关于这个问题的权威性文章之一可以找到here

+0

我已经看过这个,但当我将foreach更改为for循环时,无法提交视图。 – crunchy

+0

查看我的编辑,并将您的原始问题中的for循环修改后的代码作为编辑发布,以便我们可以看到您拥有的内容。 –

+1

嗨@AJ,你的回答是正确的。有一件事是它不必使用'for',你仍然可以使用foreach。看看这个链接:http://stackoverflow.com/questions/20842935/asp-net-mvc-complex-model-updating/20843172#20843172 – Lin