【发布时间】:2011-08-07 17:14:14
【问题描述】:
我正在用 C# 开发一个 ASP.NET MVC 3 应用程序,并且我使用 Razor。我现在正在处理一个关于通过控制器传递/接收到视图/从视图中的视图模型绑定对象的问题。 让我们说清楚。我有以下 ViewModel:
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 仅用于显示目的。 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>
}
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
}
问题在于,使用此代码,传递给 Post ActionMethod UpdateItems 的 ItemPostModel itemData 始终为空。 containerId 已正确传递。如果我在控制器中使用以下代码,结果相同(显然不是 DRY);
[HttpPost]
public ActionResult UpdateItems(ContainerViewModel container)
{
//extract itemData from ContainerViewModel container
//store itemData into repository
}
我如何“教导”应用程序我希望将表单元素存储在 List<ItemPostModel> 中?我应该修改 ModelBinder 还是有更简单的方法来执行此任务?谢谢大家的回答。
【问题讨论】:
标签: c# asp.net-mvc-3 binding viewmodel