[英]How can I bind nested ViewModels from View to Controller in MVC3?
我正在用C#开发一个ASP.NET MVC 3应用程序,我使用Razor。 我现在正处理一个问题,涉及通过Controller向View传递/接收的ViewModel绑定对象。 让我们说清楚。 我有以下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;}
}
ContainerViewModel用于将数据传递给View。 其属性ContainerId和ContainerName仅用于显示目的。 必须使用Form填充List<ItemPostModel>
属性。 View看起来像这样(它是简化版):
<strong>@Model.ContainerName</strong>
@using (Html.BeginForm())
{
<fieldset>
@foreach(var item in Model.ItemData)
{
@Html.TextBox(item.ItemId);
@Html.TextBox(item.ItemName);
@Html.TextBox(item.ItemValue);
<p>
<input type="submit" value="Save" />
</p>
}
</fieldset>
}
Controller对应的动作方法如下:
public ActionResult UpdateItems()
{
//fill in the ContainerViewModel lcontainer
return View("UpdateItems", lcontainer);
}
[HttpPost]
public ActionResult UpdateItems(int containerId, ItemPostModel itemData)
{
//store itemData into repository
}
问题是,这种代码ItemPostModel的ItemData传递给邮政ActionMethod UpdateItems总是空的。 containerId已正确传递。 如果我在Controller中使用以下代码(显然不是DRY),结果相同;
[HttpPost]
public ActionResult UpdateItems(ContainerViewModel container)
{
//extract itemData from ContainerViewModel container
//store itemData into repository
}
如何“教”我想要存储在List<ItemPostModel>
的表单元素的应用程序? 我应该修改ModelBinder还是有一种更简单的方法来执行这个任务? 谢谢大家的回答。
不要在视图中写循环。 使用编辑器模板:
<strong>@Model.ContainerName</strong>
@using (Html.BeginForm())
{
<fieldset>
@Html.EditorFor(x => x.ItemData)
<input type="submit" value="Save" />
</fieldset>
}
并在相应的编辑器模板内( ~/Views/Shared/EditorTemplates/ItemPostModel.cshtml
):
@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
}
这应该是全部。 编辑器模板将负责为绑定生成正确的输入字段名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.