使用列表列表发布表单MVC

大多数教程,我在网上找到的问题,关于模型何时有一个项目列表。 但在我的情况下,我有一个项目列表,其中还有一个项目列表。

我有一个带有ItemA列表的ItemA ,而ItemA有一个ItemsB列表

  public class ViewModel { List Items { get; set; } public ViewModel() { Items = new List(); } } public class ItemA { public int ItemAId { get; set; } public List ItemBList { get; set; } public ItemA() { ItemBList = new List(); } } public class ItemB { public int ItemBId { get; set; } // Need to input this string for each Item in List public string NewInput } 

我的看法:

 @Html.BeginForm(){ @foreach (var itemA in Model.Items) { 

@itemA.ItemAId

for (int i = 0; i itemA.ItemBList[i].ItemBId ) @Html.TextBoxFor(m => itemA.ItemBList[i].NewInput) } } }

我的控制器:

 public ActionResult SaveInfo(ViewModel model){ // Update } 

我的问题是如何为此案例编写一个表单,以便它绑定到Controller中的ViewModel?

它非常简单 – 你只需要在视图中嵌套2 for循环(不要使用foreach)

即改为:

 @Html.BeginForm(){ @for(int j = 0; j < Model.Items.Count; j++) { 

@Model.Items[j].ItemAId

@Html.HiddenFor(m => m.Items[j].ItemAId) @* (don't forget this!) *@ for (int i = 0; i < Model.Items[j].ItemBList.Count; i++) { @Html.HiddenFor(m => m.Items[j].ItemBList[i].ItemBId ) @Html.TextBoxFor(m => m.Items[j].ItemBList[i].NewInput) } } }

MVC Model Binder需要表示列表中属性的表单字段,其名称类似于[#].property1name[#].property2name ,以便在回发后的绑定期间将它们正确地相互关联。 同样的原则适用于listitems的列表属性。 在使用HTML帮助程序时,您需要使用for循环而不是foreach循环来获取正确的表单字段名称!