我在网上找到的大多数教程,问题关于模型何时有一个项目列表。但在我的案例中,我有一个项目清单,其中还有一个项目清单。
我有一个名为ItemA
的ViewModel,ItemA
列有ItemsB
public class ViewModel
{
List<ItemA> Items { get; set; }
public ViewModel()
{
Items = new List<ItemA>();
}
}
public class ItemA
{
public int ItemAId { get; set; }
public List<ItemB> ItemBList { get; set; }
public ItemA()
{
ItemBList = new List<ItemB>();
}
}
public class ItemB
{
public int ItemBId { get; set; }
// Need to input this string for each Item in List<ItemA>
public string NewInput
}
我的观点:
@Html.BeginForm(){
@foreach (var itemA in Model.Items)
{
<p>@itemA.ItemAId</p>
for (int i = 0; i < itemA.ItemBList.Count; i++)
{
@Html.HiddenFor(m => itemA.ItemBList[i].ItemBId )
@Html.TextBoxFor(m => itemA.ItemBList[i].NewInput)
}
<button type="submit">Submit</button>
}
}
我的控制器:
public ActionResult SaveInfo(ViewModel model){
// Update
}
我的问题是如何为此案例编写一个表单,以便它绑定到Controller中的ViewModel?
答案 0 :(得分:4)
它相当简单 - 你只需要在视图中嵌套2 for
个循环(不要使用foreach)
即改为:
@Html.BeginForm(){
@for(int j = 0; j < Model.Items.Count; j++)
{
<p>@Model.Items[j].ItemAId</p>
@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)
}
}
<button type="submit">Submit</button>
}
MVC Model Binder要求表示列表中属性的表单字段的名称类似于[#].property1name
,[#].property2name
,以便在回发后的绑定期间将它们正确地相互关联。同样的原则适用于listitems的列表属性。在使用HTML帮助程序时,您需要使用for
循环而不是foreach
循环来获取正确的表单字段名称!