我如何在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用于将数据传递给视图。它的属性ContainerIdContainerName仅用于显示目的。 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还是有更简单的方法来执行此任务?谢谢大家的回答。

我如何在mvc中绑定从视图到控制器的嵌套视图模型

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

<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
}

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