Post 带有列表列表的表单 MVC

Post Form MVC with List of List

我在网上找到的大多数教程和问题都是关于模型何时具有一个项目列表的。但在我的例子中,我有一个项目列表,其中还有一个项目列表。

我有一个包含 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?

它相当简单 - 您只需要在视图中嵌套 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 模型绑定器要求在列表中表示属性的表单字段被命名为类似 [#].property1name[#].property2name 的名称,以便在回发后绑定期间将它们正确地相互关联。同样的原则适用于列表项的列表属性。使用 HTML 助手时,您需要使用 for 循环而不是 foreach 循环来获取正确的表单字段名称!