我如何在mvc中绑定从视图到控制器的嵌套视图模型
本文关键字:视图 控制器 模型 嵌套 绑定 mvc | 更新日期: 2023-09-27 17:50:31
我正在开发一个ASP。asp.net MVC 3应用程序,c#和我使用Razor。我现在正在处理一个关于通过ViewModels传递/接收到/从控制器的视图对象绑定的问题。让我们把话说清楚。我有以下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用于将数据传递给视图。它的属性ContainerId和ContainerName仅用于显示目的。 List<ItemPostModel>
属性必须使用Form填充。视图看起来像这样(这是一个简化版本):
<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>
}
控制器对应的动作方法如下:
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传递给Post ActionMethod UpdateItems总是空的。containerId正确传递。如果我在控制器中使用以下代码(显然不是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
}
应该就这些了。编辑器模板将负责为绑定生成正确的输入字段名。