MVC 2.0 中的列表绑定列表

Binding List of Lists in MVC 2.0

提问人:Rafalon 提问时间:3/25/2019 最后编辑:Rafalon 更新时间:4/3/2019 访问量:432

问:

我需要在表单中处理一个,但找不到如何继续使用旧版本的 MVC 和 .NET。List<List<T>>

我确实尝试了以下方法:

型:

public class MyModel
{
    public List<List<Item>> ListA { get; set; }
}

public class Item
{
    public string Name { get; set; }
    public string Spec { get; set; }
    public string Type { get; set; }
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
    public string Field4 { get; set; }
    public string Field5 { get; set; }
}

视图:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyModel>" %>

<% for(int i = 0; i < Model.ListA.Count; i++) { %>
    <fieldset>
        <div>
            <input disabled="disabled" value="Name" />
            <input disabled="disabled" value="Spec" />
            <input disabled="disabled" value="Type" />
            <input disabled="disabled" value="Field 1" />
            <input disabled="disabled" value="Field 2" />
            <input disabled="disabled" value="Field 3" />
            <input disabled="disabled" value="Field 4" />
            <input disabled="disabled" value="Field 5" />
        </div>
        <% for(int j = 0; j < Model.ListA[i].Count; j++) { %>
            <div>
                <%= Html.EditorFor(m => m.ListA[i][j].Name)%>
                <%= Html.EditorFor(m => m.ListA[i][j].Spec)%>
                <%= Html.EditorFor(m => m.ListA[i][j].Type)%>
                <%= Html.EditorFor(m => m.ListA[i][j].Field1)%>
                <%= Html.EditorFor(m => m.ListA[i][j].Field2)%>
                <%= Html.EditorFor(m => m.ListA[i][j].Field3)%>
                <%= Html.EditorFor(m => m.ListA[i][j].Field4)%>
                <%= Html.EditorFor(m => m.ListA[i][j].Field5)%>
            </div>
        <% } %>
    </div>
<% } %>

控制器:

[HttpGet]
public ActionResult MyAction(int Id)
{
    // MyModel modObj = MyService.GetModelById(Id);
    MyModel modObj = new MyModel
    {
        ListA = new List<List<Item>>
        {
            new List<Item>
            {
                new Item { Name = "0 - 0" },
                new Item { Name = "0 - 1" },
                new Item { Name = "0 - 2" }
            },
            new List<Item>
            {
                new Item { Name = "1 - 0" },
                new Item { Name = "1 - 1" },
                new Item { Name = "1 - 2" }
            }
        }
    }

    return View(modObj);
}

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    // anything
    return null;
}

我的问题是,目前,即使我可以正确地看到每个项目的编辑器(这里是三个项目的两个列表),当我将其发布回来时,我也只能看到控制器中三个项目的第一个列表。

我还尝试将我的模型更改为:

public class MyModel
{
   public List<ItemList> ListA { get; set; }
}

public class ItemList
{
    public string PropId { get; set; }
    public List<Item> ListB { get; set; }
}

public class Item
{
    public string Name { get; set; }
    public string Spec { get; set; }
    public string Type { get; set; }
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
    public string Field4 { get; set; }
    public string Field5 { get; set; }
}

并相应地更改了我的视图和控制器,但我仍然得到相同的结果:当我将其发回时,第一个列表级别仅包含一个列表 - 我只在控制器的 POST 方法中设置断点时得到 和 。"0 - 0""0 - 1""0 - 2"

我在这里不知所措。

编辑:为了回答 Jonny 的问题,它看起来像:List<ItemList>

<fieldset>
    <div>
        <input disabled="disabled" value="Name" />
        <input disabled="disabled" value="Spec" />
        <input disabled="disabled" value="Type" />
        <input disabled="disabled" value="Field 1" />
        <input disabled="disabled" value="Field 2" />
        <input disabled="disabled" value="Field 3" />
        <input disabled="disabled" value="Field 4" />
        <input disabled="disabled" value="Field 5" />
    </div>
    <div>
        <input name="ListA[0].ListB[0].Name" id="ListA_0__ListB_0__Name" type="text" value="0 - 0"></input>
        <input name="ListA[0].ListB[0].Spec" id="ListA_0__ListB_0__Spec" type="text"></input>
        <input name="ListA[0].ListB[0].Type" id="ListA_0__ListB_0__Type" type="text"></input>
        <input name="ListA[0].ListB[0].Field1" id="ListA_0__ListB_0__Field1" type="text"></input>
        <input name="ListA[0].ListB[0].Field2" id="ListA_0__ListB_0__Field2" type="text"></input>
        <input name="ListA[0].ListB[0].Field3" id="ListA_0__ListB_0__Field3" type="text"></input>
        <input name="ListA[0].ListB[0].Field4" id="ListA_0__ListB_0__Field4" type="text"></input>
        <input name="ListA[0].ListB[0].Field5" id="ListA_0__ListB_0__Field5" type="text"></input>
    </div>
    <div>
        <input name="ListA[0].ListB[1].Name" id="ListA_0__ListB_1__Name" type="text" value="0 - 1"></input>
        <input name="ListA[0].ListB[1].Spec" id="ListA_0__ListB_1__Spec" type="text"></input>
        <input name="ListA[0].ListB[1].Type" id="ListA_0__ListB_1__Type" type="text"></input>
        <input name="ListA[0].ListB[1].Field1" id="ListA_0__ListB_1__Field1" type="text"></input>
        <input name="ListA[0].ListB[1].Field2" id="ListA_0__ListB_1__Field2" type="text"></input>
        <input name="ListA[0].ListB[1].Field3" id="ListA_0__ListB_1__Field3" type="text"></input>
        <input name="ListA[0].ListB[1].Field4" id="ListA_0__ListB_1__Field4" type="text"></input>
        <input name="ListA[0].ListB[1].Field5" id="ListA_0__ListB_1__Field5" type="text"></input>
    </div>
    <div>
        <input name="ListA[0].ListB[2].Name" id="ListA_0__ListB_2__Name" type="text" value="0 - 2"></input>
        <input name="ListA[0].ListB[2].Spec" id="ListA_0__ListB_2__Spec" type="text"></input>
        <input name="ListA[0].ListB[2].Type" id="ListA_0__ListB_2__Type" type="text"></input>
        <input name="ListA[0].ListB[2].Field1" id="ListA_0__ListB_2__Field1" type="text"></input>
        <input name="ListA[0].ListB[2].Field2" id="ListA_0__ListB_2__Field2" type="text"></input>
        <input name="ListA[0].ListB[2].Field3" id="ListA_0__ListB_2__Field3" type="text"></input>
        <input name="ListA[0].ListB[2].Field4" id="ListA_0__ListB_2__Field4" type="text"></input>
        <input name="ListA[0].ListB[2].Field5" id="ListA_0__ListB_2__Field5" type="text"></input>
    </div>
</fieldset>
<fieldset>
    <div>
        <input disabled="disabled" value="Name" />
        <input disabled="disabled" value="Spec" />
        <input disabled="disabled" value="Type" />
        <input disabled="disabled" value="Field 1" />
        <input disabled="disabled" value="Field 2" />
        <input disabled="disabled" value="Field 3" />
        <input disabled="disabled" value="Field 4" />
        <input disabled="disabled" value="Field 5" />
    </div>
    <div>
        <input name="ListA[1].ListB[0].Name" id="ListA_1__ListB_0__Name" type="text" value="1 - 0"></input>
        <input name="ListA[1].ListB[0].Spec" id="ListA_1__ListB_0__Spec" type="text"></input>
        <input name="ListA[1].ListB[0].Type" id="ListA_1__ListB_0__Type" type="text"></input>
        <input name="ListA[1].ListB[0].Field1" id="ListA_1__ListB_0__Field1" type="text"></input>
        <input name="ListA[1].ListB[0].Field2" id="ListA_1__ListB_0__Field2" type="text"></input>
        <input name="ListA[1].ListB[0].Field3" id="ListA_1__ListB_0__Field3" type="text"></input>
        <input name="ListA[1].ListB[0].Field4" id="ListA_1__ListB_0__Field4" type="text"></input>
        <input name="ListA[1].ListB[0].Field5" id="ListA_1__ListB_0__Field5" type="text"></input>
    </div>
    <div>
        <input name="ListA[1].ListB[1].Name" id="ListA_1__ListB_1__Name" type="text" value="1 - 1"></input>
        <input name="ListA[1].ListB[1].Spec" id="ListA_1__ListB_1__Spec" type="text"></input>
        <input name="ListA[1].ListB[1].Type" id="ListA_1__ListB_1__Type" type="text"></input>
        <input name="ListA[1].ListB[1].Field1" id="ListA_1__ListB_1__Field1" type="text"></input>
        <input name="ListA[1].ListB[1].Field2" id="ListA_1__ListB_1__Field2" type="text"></input>
        <input name="ListA[1].ListB[1].Field3" id="ListA_1__ListB_1__Field3" type="text"></input>
        <input name="ListA[1].ListB[1].Field4" id="ListA_1__ListB_1__Field4" type="text"></input>
        <input name="ListA[1].ListB[1].Field5" id="ListA_1__ListB_1__Field5" type="text"></input>
    </div>
    <div>
        <input name="ListA[1].ListB[2].Name" id="ListA_1__ListB_2__Name" type="text" value="1 - 2"></input>
        <input name="ListA[1].ListB[2].Spec" id="ListA_1__ListB_2__Spec" type="text"></input>
        <input name="ListA[1].ListB[2].Type" id="ListA_1__ListB_2__Type" type="text"></input>
        <input name="ListA[1].ListB[2].Field1" id="ListA_1__ListB_2__Field1" type="text"></input>
        <input name="ListA[1].ListB[2].Field2" id="ListA_1__ListB_2__Field2" type="text"></input>
        <input name="ListA[1].ListB[2].Field3" id="ListA_1__ListB_2__Field3" type="text"></input>
        <input name="ListA[1].ListB[2].Field4" id="ListA_1__ListB_2__Field4" type="text"></input>
        <input name="ListA[1].ListB[2].Field5" id="ListA_1__ListB_2__Field5" type="text"></input>
    </div>
</fieldset>

并带有:List<List<Item>>

<fieldset>
    <div>
        <input disabled="disabled" value="Name" />
        <input disabled="disabled" value="Spec" />
        <input disabled="disabled" value="Type" />
        <input disabled="disabled" value="Field 1" />
        <input disabled="disabled" value="Field 2" />
        <input disabled="disabled" value="Field 3" />
        <input disabled="disabled" value="Field 4" />
        <input disabled="disabled" value="Field 5" />
    </div>
    <div>
        <input name="ListA[0][0].Name" id="ListA_0__0__Name" type="text" value="0 - 0"></input>
        <input name="ListA[0][0].Spec" id="ListA_0__0__Spec" type="text"></input>
        <input name="ListA[0][0].Type" id="ListA_0__0__Type" type="text"></input>
        <input name="ListA[0][0].Field1" id="ListA_0__0__Field1" type="text"></input>
        <input name="ListA[0][0].Field2" id="ListA_0__0__Field2" type="text"></input>
        <input name="ListA[0][0].Field3" id="ListA_0__0__Field3" type="text"></input>
        <input name="ListA[0][0].Field4" id="ListA_0__0__Field4" type="text"></input>
        <input name="ListA[0][0].Field5" id="ListA_0__0__Field5" type="text"></input>
    </div>
    <div>
        <input name="ListA[0][1].Name" id="ListA_0__1__Name" type="text" value="0 - 1"></input>
        <input name="ListA[0][1].Spec" id="ListA_0__1__Spec" type="text"></input>
        <input name="ListA[0][1].Type" id="ListA_0__1__Type" type="text"></input>
        <input name="ListA[0][1].Field1" id="ListA_0__1__Field1" type="text"></input>
        <input name="ListA[0][1].Field2" id="ListA_0__1__Field2" type="text"></input>
        <input name="ListA[0][1].Field3" id="ListA_0__1__Field3" type="text"></input>
        <input name="ListA[0][1].Field4" id="ListA_0__1__Field4" type="text"></input>
        <input name="ListA[0][1].Field5" id="ListA_0__1__Field5" type="text"></input>
    </div>
    <div>
        <input name="ListA[0][2].Name" id="ListA_0__2__Name" type="text" value="0 - 2"></input>
        <input name="ListA[0][2].Spec" id="ListA_0__2__Spec" type="text"></input>
        <input name="ListA[0][2].Type" id="ListA_0__2__Type" type="text"></input>
        <input name="ListA[0][2].Field1" id="ListA_0__2__Field1" type="text"></input>
        <input name="ListA[0][2].Field2" id="ListA_0__2__Field2" type="text"></input>
        <input name="ListA[0][2].Field3" id="ListA_0__2__Field3" type="text"></input>
        <input name="ListA[0][2].Field4" id="ListA_0__2__Field4" type="text"></input>
        <input name="ListA[0][2].Field5" id="ListA_0__2__Field5" type="text"></input>
    </div>
</fieldset>
<fieldset>
    <div>
        <input disabled="disabled" value="Name" />
        <input disabled="disabled" value="Spec" />
        <input disabled="disabled" value="Type" />
        <input disabled="disabled" value="Field 1" />
        <input disabled="disabled" value="Field 2" />
        <input disabled="disabled" value="Field 3" />
        <input disabled="disabled" value="Field 4" />
        <input disabled="disabled" value="Field 5" />
    </div>
    <div>
        <input name="ListA[1][0].Name" id="ListA_1__0__Name" type="text" value="1 - 0"></input>
        <input name="ListA[1][0].Spec" id="ListA_1__0__Spec" type="text"></input>
        <input name="ListA[1][0].Type" id="ListA_1__0__Type" type="text"></input>
        <input name="ListA[1][0].Field1" id="ListA_1__0__Field1" type="text"></input>
        <input name="ListA[1][0].Field2" id="ListA_1__0__Field2" type="text"></input>
        <input name="ListA[1][0].Field3" id="ListA_1__0__Field3" type="text"></input>
        <input name="ListA[1][0].Field4" id="ListA_1__0__Field4" type="text"></input>
        <input name="ListA[1][0].Field5" id="ListA_1__0__Field5" type="text"></input>
    </div>
    <div>
        <input name="ListA[1][1].Name" id="ListA_1__1__Name" type="text" value="1 - 1"></input>
        <input name="ListA[1][1].Spec" id="ListA_1__1__Spec" type="text"></input>
        <input name="ListA[1][1].Type" id="ListA_1__1__Type" type="text"></input>
        <input name="ListA[1][1].Field1" id="ListA_1__1__Field1" type="text"></input>
        <input name="ListA[1][1].Field2" id="ListA_1__1__Field2" type="text"></input>
        <input name="ListA[1][1].Field3" id="ListA_1__1__Field3" type="text"></input>
        <input name="ListA[1][1].Field4" id="ListA_1__1__Field4" type="text"></input>
        <input name="ListA[1][1].Field5" id="ListA_1__1__Field5" type="text"></input>
    </div>
    <div>
        <input name="ListA[1][2].Name" id="ListA_1__2__Name" type="text" value="1 - 2"></input>
        <input name="ListA[1][2].Spec" id="ListA_1__2__Spec" type="text"></input>
        <input name="ListA[1][2].Type" id="ListA_1__2__Type" type="text"></input>
        <input name="ListA[1][2].Field1" id="ListA_1__2__Field1" type="text"></input>
        <input name="ListA[1][2].Field2" id="ListA_1__2__Field2" type="text"></input>
        <input name="ListA[1][2].Field3" id="ListA_1__2__Field3" type="text"></input>
        <input name="ListA[1][2].Field4" id="ListA_1__2__Field4" type="text"></input>
        <input name="ListA[1][2].Field5" id="ListA_1__2__Field5" type="text"></input>
    </div>
</fieldset>


编辑 2

我终于成功了,一行一行地重写了相同的代码......
所以我不知道为什么它以前不起作用。

C# ASP.NET-MVC-2 嵌套列表

评论

0赞 Tetsuya Yamamoto 3/25/2019
本地计算机中没有MVC 4(使用ASPX)和5(使用Razor)的重现,也尝试过使用此小提琴,并且在回发时成功检索了两个列表。在回发期间,第一个级别包含哪个列表(第一个值为零或 1)?List
0赞 Rafalon 3/25/2019
@TetsuyaYamamoto那些有 的,我知道它应该与最近的框架一起工作,这就是为什么我特别说我正在使用一个非常古老的框架"0 - x"
0赞 Jonny 4/1/2019
生成的 html 输入是什么样的?
0赞 Rafalon 4/1/2019
@Jonny 我编辑了我的问题来回答你的问题

答:

0赞 rami 4/2/2019 #1

视图

@model WebApplication1.Controllers.MyModel

@{
    Layout = null;
    var model = Model;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index1</title>
</head>
<body>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    {
    for (int i = 0; i < Model.ListA.Count; i++)
    {
    <div>
         @for (int j = 0; j < Model.ListA[i].Count; j++)
         {
        <div>
             @Html.EditorFor(m => m.ListA[i][j].Property1)
        </div>
         } 
    </div>
        }
        <input type="submit" value="Create" class="btn btn-default" />
    }
}
    <p>

        @Html.ActionLink("Back to List", "Index")
    </p>
</body>
</html>

评论

0赞 DeshDeep Singh 4/2/2019
您好@rami请您解释一下您的答案
0赞 rami 4/3/2019
@using (Html.BeginForm()){} 基本上创建一个表单。其中的提交按钮将提交表单并将字段转换为 JSON,Controller 中的 HTTP POST 方法将使用具有正确数据的模型的 Intern。
0赞 DeshDeep Singh 4/3/2019
你能编辑你的答案,评论你的代码并解释你做了什么吗?这种形式的回答是没有帮助的。
0赞 Rafalon 4/3/2019
您好,欢迎来到 StackOverflow。虽然这肯定与现代框架的预期一样工作,但我看不出它与我当前的代码有何不同(除了当我特别要求 .NET Framework 4、MVC 2 以及 ASPX 时您使用了 Razor 这一事实)。我真的很想你能解释一下是什么让你认为它回答了我的问题:)