C# 将嵌套集合从MVC视图发布到控制器

C# 将嵌套集合从MVC视图发布到控制器,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个行列表,其中包含一个行列表,每行都有一个行列表 这就是结果: 景色 <table class="table"> <tr> <th> @Html.DisplayName("Nome do Grupo") </th> <th> @Html.DisplayName("Linhas") </th> <th></th> </

我有一个
行列表
,其中包含一个
行列表
,每行都有一个
行列表

这就是结果:

景色

<table class="table">
<tr>
    <th>
        @Html.DisplayName("Nome do Grupo")
    </th>
    <th>
        @Html.DisplayName("Linhas")
    </th>
    <th></th>
</tr>
@using (Html.BeginForm("Forms", "ProcessLane", FormMethod.Post))
{
    foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.GroupName)
            </td>
            <td>
                @{
                    foreach (var t in item.RowLane)
                    {
                        @Html.CheckBoxFor(model => t.IsChecked)
                        @Html.DisplayFor(modelItem => t.LaneName)                           
                    }
                }
            </td>
            <td>               
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Adicionar" class="btn btn-default" />
                </div>                
            </td>
        </tr>

    }
}

@Html.DisplayName(“Nome do Grupo”)
@Html.DisplayName(“Linhas”)
@使用(Html.BeginForm(“Forms”、“ProcessLane”、FormMethod.Post))
{
foreach(模型中的var项目)
{
@DisplayFor(modelItem=>item.GroupName)
@{
foreach(item.RowLane中的变量t)
{
@Html.CheckBoxFor(model=>t.IsChecked)
@DisplayFor(modeleItem=>t.LaneName)
}
}
}
}
课程及类别:

public class Line
{
    public int IdGroup { get; set; }
    public string GroupName { get; set; }

    public List<RowLane> RowLane { get; set; }
}

public class RowLane
{
    public string IdLane { get; set; }
    public string LaneName { get; set; }
    public bool IsChecked { get; set; }
}
公共类行
{
公共int IdGroup{get;set;}
公共字符串组名{get;set;}
公共列表行车道{get;set;}
}
公共级赛道
{
公共字符串IdLane{get;set;}
公共字符串LaneName{get;set;}
已检查公共布尔值{get;set;}
}

我只需要收集所选行的GroupID和所有复选框。

在您的场景中,要将所选行的数据从视图发布到控制器,您只需:

@model List<Path.To.Your.Models.Line>

@{
    ViewBag.Title = "test";
}

<h2>test</h2>



@for (var i = 0; i < Model.Count; i++)
{    
  <form action=@Url.Action("ProcessLane", new { IdGroup = Model[i].IdGroup}) method="post">        
    <div class="row parentWrap">
        @for (var j = 0; j < Model[i].RowLane.Count; j++)
        {
           <div class="row">
               @Html.Hidden("[" + j + "].IdLane", Model[i].RowLane[j].IdLane)
               @Html.Hidden("[" + j + "].LaneName", Model[i].RowLane[j].LaneName)
               @Html.CheckBox("[" + j + "].IsChecked")
               @Html.Label(Model[i].RowLane[j].LaneName)
           </div>
        }
        <input type="submit" class="btn btn-primary sss" value="send" />
    </div>
  </form>
  <hr />    
}
@型号列表
@{
ViewBag.Title=“测试”;
}
测试
@对于(var i=0;i
}
还有一些要在控制器中检查的示例数据:

public ActionResult test()
    {
        IEnumerable<Line> line = new List<Line> 
            { new Line{
                 IdGroup = 100,
                 GroupName = "Nojan",
                 RowLane = new List<RowLane> { new RowLane { IdLane = "1", IsChecked = true, LaneName = "pizza"},
                                               new RowLane { IdLane = "2", IsChecked = false, LaneName = "lazogna"}
                 }
                },
                 new Line{
                 IdGroup = 101,
                 GroupName = "Noj",
                 RowLane = new List<RowLane> { new RowLane { IdLane = "3", IsChecked = false, LaneName = "pizza"},
                                               new RowLane { IdLane = "4", IsChecked = false, LaneName = "lazogna"}
                 }
            }                     
    };

        return View(line.ToList());
    }


public ActionResult ProcessLane(int? IdGroup, List<RowLane> input)
{
        // Code here as you wish, form is submitted to this method
}
公共操作结果测试()
{
IEnumerable行=新列表
{新线{
IdGroup=100,
GroupName=“Nojan”,
RowLane=new List{new RowLane{IdLane=“1”,IsChecked=true,LaneName=“pizza”},
新建行车道{IdLane=“2”,IsChecked=false,LaneName=“lazogna”}
}
},
新线{
IdGroup=101,
GroupName=“Noj”,
RowLane=new List{new RowLane{IdLane=“3”,IsChecked=false,LaneName=“pizza”},
新建行车道{IdLane=“4”,IsChecked=false,LaneName=“lazogna”}
}
}                     
};
返回视图(line.ToList());
}
public ActionResult ProcessLane(int?IdGroup,列表输入)
{
//如您所愿在此处编码,表单将提交到此方法
}
我成功地运行并测试了代码。您可以根据需要定制


希望这有帮助:)

在您的场景中,要将所选行的数据从视图发布到控制器,您只需:

@model List<Path.To.Your.Models.Line>

@{
    ViewBag.Title = "test";
}

<h2>test</h2>



@for (var i = 0; i < Model.Count; i++)
{    
  <form action=@Url.Action("ProcessLane", new { IdGroup = Model[i].IdGroup}) method="post">        
    <div class="row parentWrap">
        @for (var j = 0; j < Model[i].RowLane.Count; j++)
        {
           <div class="row">
               @Html.Hidden("[" + j + "].IdLane", Model[i].RowLane[j].IdLane)
               @Html.Hidden("[" + j + "].LaneName", Model[i].RowLane[j].LaneName)
               @Html.CheckBox("[" + j + "].IsChecked")
               @Html.Label(Model[i].RowLane[j].LaneName)
           </div>
        }
        <input type="submit" class="btn btn-primary sss" value="send" />
    </div>
  </form>
  <hr />    
}
@型号列表
@{
ViewBag.Title=“测试”;
}
测试
@对于(var i=0;i
}
还有一些要在控制器中检查的示例数据:

public ActionResult test()
    {
        IEnumerable<Line> line = new List<Line> 
            { new Line{
                 IdGroup = 100,
                 GroupName = "Nojan",
                 RowLane = new List<RowLane> { new RowLane { IdLane = "1", IsChecked = true, LaneName = "pizza"},
                                               new RowLane { IdLane = "2", IsChecked = false, LaneName = "lazogna"}
                 }
                },
                 new Line{
                 IdGroup = 101,
                 GroupName = "Noj",
                 RowLane = new List<RowLane> { new RowLane { IdLane = "3", IsChecked = false, LaneName = "pizza"},
                                               new RowLane { IdLane = "4", IsChecked = false, LaneName = "lazogna"}
                 }
            }                     
    };

        return View(line.ToList());
    }


public ActionResult ProcessLane(int? IdGroup, List<RowLane> input)
{
        // Code here as you wish, form is submitted to this method
}
公共操作结果测试()
{
IEnumerable行=新列表
{新线{
IdGroup=100,
GroupName=“Nojan”,
RowLane=new List{new RowLane{IdLane=“1”,IsChecked=true,LaneName=“pizza”},
新建行车道{IdLane=“2”,IsChecked=false,LaneName=“lazogna”}
}
},
新线{
IdGroup=101,
GroupName=“Noj”,
RowLane=new List{new RowLane{IdLane=“3”,IsChecked=false,LaneName=“pizza”},
新建行车道{IdLane=“4”,IsChecked=false,LaneName=“lazogna”}
}
}                     
};
返回视图(line.ToList());
}
public ActionResult ProcessLane(int?IdGroup,列表输入)
{
//如您所愿在此处编码,表单将提交到此方法
}
我成功地运行并测试了代码。您可以根据需要定制


希望这有帮助:)

您可以使用编辑器模板来解决此问题,如中所述。另外,当表单处于循环之外时,多个提交按钮有什么意义?单击任何行的任何按钮都将提交所有数据。对于每个组,我可以为此组分配一个或多个车道。您能重新排列视图吗?您的意思是什么?想象一下这是一个列表视图,每行都有一个
onClick
方法,我要做的是,如果我单击此行的按钮,我得到所有选中项的值。您可以使用编辑器模板来解决此问题,如中所述。另外,当表单处于循环之外时,多个提交按钮有什么意义?单击任何行的任何按钮都将提交所有数据。对于每个组,我可以为此组分配一个或多个车道。您可以重新排列视图吗?您的意思是什么?假设这是一个列表视图,每行都有一个
onClick
方法,我要做的是,如果单击此行的按钮,我将获得所有选中项的值。