使用列表的MVC表单提交

4

我在网上发现的大部分教程和问题都是针对模型只有一个项目列表的情况。但是在我的情况下,我有一个项目列表,进一步包含了另一个项目列表。

我有一个带有ItemA列表的视图模型,而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
}

我的问题是,如何编写一个表单,使其与控制器中的ViewModel绑定?

MVC 模式中没有后台回发机制。 - Inspector Squirrel
请使用for循环进行操作。 - Ehsan Sajjad
@EhsanSajjad 我正在使用for循环,但是我得到了NULL。 - Dawood Awan
你是否实际上有任何与ItemA记录相关联的ItemB记录? - ragerory
你能告诉我你想让它看起来像什么吗?我的意思是 - UI 是什么样的?用户可以选择一个项目 A 或单个项目 B,或者可能是多个元素吗?也许这是级联下拉列表的位置?请更准确地描述它。 - Arkadiusz Kałkus
1个回答

3

这很简单 - 你只需要在视图中嵌套两个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,以便在回发后正确地将它们关联起来进行绑定。相同的原则适用于listitems的列表属性。当使用HTML助手时,您需要使用for循环而不是foreach循环来获取正确的表单字段名称!

@James S 在我的测试项目中似乎可以工作。谢谢。 - Dawood Awan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接