使用列表列表发布表单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
循环来获取正确的表单字段名称!