C# 在MVC3中,如何将嵌套视图模型从视图绑定到控制器?

C# 在MVC3中,如何将嵌套视图模型从视图绑定到控制器?,c#,asp.net-mvc-3,binding,viewmodel,C#,Asp.net Mvc 3,Binding,Viewmodel,我正在用C#开发一个ASP.NET MVC 3应用程序,我使用Razor。我现在正在处理一个有关通过控制器传递/接收到/来自视图的ViewModels绑定对象的问题。 让我们说清楚。我有以下视图模型: public class ContainerViewModel { public int ContainerId {get; set;} public string ContainerName {get; set;} public List<ItemPostModel>

我正在用C#开发一个ASP.NET MVC 3应用程序,我使用Razor。我现在正在处理一个有关通过控制器传递/接收到/来自视图的ViewModels绑定对象的问题。 让我们说清楚。我有以下视图模型:

public class ContainerViewModel
{
   public int ContainerId {get; set;}
   public string ContainerName {get; set;}
   public List<ItemPostModel> ItemData {get; set;}
}

public class ItemPostModel
{ 
   public int ItemId {get; set;}
   public string ItemName {get; set;}
   public int ItemValue {get; set;}
}
问题在于,使用此代码,传递给PostActionMethod UpdateItemsItemPostModel itemData始终为空。已正确传递集装箱ID。如果我在控制器中使用以下代码,结果相同(显然不是干的)


如何“教导”应用程序我希望表单元素存储在列表中?我应该修改ModelBinder还是有一种更简单的方法来执行此任务?谢谢大家的回答。

不要在视图中写循环。使用编辑器模板:

<strong>@Model.ContainerName</strong>
@using (Html.BeginForm()) 
{
    <fieldset>
        @Html.EditorFor(x => x.ItemData)
        <input type="submit" value="Save" />
    </fieldset>
}
在控制器操作中,您可能需要指定前缀:

[HttpPost]
public ActionResult UpdateItems(
    int containerId, 
    [Bind(Prefix = "ItemData")]ItemPostModel itemData
)
{
   //store itemData into repository
}

差不多就这些了。编辑器模板将负责为绑定生成正确的输入字段名称。

谢谢您的回答。~/Views/Shared/EditorTemplates/ItemPostModel.cshtml是部分视图,对吗?此外,您为什么建议不要在视图中使用foreach?难道不是用代码块“破坏”html吗?Thanks@Francesco是的,
ItemPostModel.cshtml
是一个部分。我还建议避免在视图中使用循环,因为有编辑器模板负责为输入字段生成专有名称。因此,这不仅简化了代码,而且当您想要在控制器中获取这些值时,它可以与默认的模型绑定器一起工作。我最初忽略的一个值得强调的要点是,EditorFor帮助器自动处理ItemPostModel的集合,即使EditorTemplate用于单个ItemPostModel(而不是集合)。它应该是
@Html.TextBoxFor(x=>x.ItemId)
,而不是
@Html.TextBox(x=>x.ItemId)
[Bind(Prefix=Items)]。。。真的帮了我
[HttpPost]
public ActionResult UpdateItems(ContainerViewModel container)
{
   //extract itemData from ContainerViewModel container
   //store itemData into repository
}
<strong>@Model.ContainerName</strong>
@using (Html.BeginForm()) 
{
    <fieldset>
        @Html.EditorFor(x => x.ItemData)
        <input type="submit" value="Save" />
    </fieldset>
}
@model ItemPostModel
@Html.TextBox(x => x.ItemId)
@Html.TextBox(x => x.ItemName)
@Html.TextBox(x => x.ItemValue)
[HttpPost]
public ActionResult UpdateItems(
    int containerId, 
    [Bind(Prefix = "ItemData")]ItemPostModel itemData
)
{
   //store itemData into repository
}