C# 使用列表的列表发布表单MVC
大多数教程,我在网上找到的关于模型何时有一个项目列表的问题。但在我的例子中,我有一个项目列表,它还有一个项目列表 我有一个带有C# 使用列表的列表发布表单MVC,c#,asp.net-mvc,razor,model-view-controller,C#,Asp.net Mvc,Razor,Model View Controller,大多数教程,我在网上找到的关于模型何时有一个项目列表的问题。但在我的例子中,我有一个项目列表,它还有一个项目列表 我有一个带有ItemA列表的ViewModel,而ItemA有一个ItemsB public class ViewModel { List<ItemA> Items { get; set; } public ViewModel() { Items = new List<ItemA&g
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
}
我的问题是,如何为这种情况编写表单,使其绑定回Controller中的ViewModel?这相当简单-您只需在视图中为循环嵌套2个
(不要使用foreach)
ie更改为:
@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>
}
@Html.BeginForm(){
@对于(int j=0;j
@Html.HiddenFor(m=>m.Items[j].ItemAId)
@*(别忘了这个!)*@
对于(int i=0;im.Items[j].ItemBList[i].ItemBId)
@Html.TextBoxFor(m=>m.Items[j].ItemBList[i].NewInput)
}
}
提交
}
MVC模型绑定器要求将表示列表中属性的表单字段命名为[#].propertyName
,[#].propertyName
,以便在回发后绑定期间正确地将它们相互关联。同样的原则也适用于listitems的列表属性。使用HTML帮助程序时,需要使用for
循环而不是foreach
循环来获取正确的表单字段名 MVC中没有回发机制。请使用for loop for it。@我使用的是EhsanSajjad for loop,我得到的是null。您确实有任何与ItemA记录关联的ItemB记录吗?您能告诉我它的外观吗?我的意思是-用户界面是什么?用户可以选择一个项目A或单个项目B,也可以选择多个元素?也许这是一个放置cascade下拉列表的地方?请更准确地描述它。@James S似乎正在我的测试项目中工作。谢谢
public ActionResult SaveInfo(ViewModel model){
// Update
}
@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>
}