C# 在MVC3中,如何将嵌套视图模型从视图绑定到控制器?
我正在用C#开发一个ASP.NET MVC 3应用程序,我使用Razor。我现在正在处理一个有关通过控制器传递/接收到/来自视图的ViewModels绑定对象的问题。 让我们说清楚。我有以下视图模型: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>
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 UpdateItems的ItemPostModel 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
}