gpt4 book ai didi

c# - 如何在 MVC3 中将嵌套的 ViewModel 从 View 绑定(bind)到 Controller?

转载 作者:IT王子 更新时间:2023-10-29 04:22:04 24 4
gpt4 key购买 nike

我正在用 C# 开发一个 ASP.NET MVC 3 应用程序,我使用 Razor。我现在正在处理一个问题,该问题涉及通过 Controller 通过 View 传递给 View /从 View 接收的 View 模型来绑定(bind)对象。让我们说清楚。我有以下 View 模型:

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 。它的属性 ContainerIdContainerName 仅用于显示目的。 <强> List<ItemPostModel> 属性必须使用 Form 填写。 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对应的action methods如下:

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 UpdateItemsItemPostModel itemData 始终为空。 containerId 已正确传递。如果我在 Controller 中使用以下代码(显然不是 DRY),结果相同;

[HttpPost]
public ActionResult UpdateItems(ContainerViewModel container)
{
//extract itemData from ContainerViewModel container
//store itemData into repository
}

我如何“教”应用程序我想要将表单元素存储在 List<ItemPostModel> 中? ?我应该修改 ModelBinder 还是有更简单的方法来执行此任务?感谢大家的回答。

最佳答案

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

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

并且在 Controller 操作中您可能需要指定前缀:

[HttpPost]
public ActionResult UpdateItems(
int containerId,
[Bind(Prefix = "ItemData")]ItemPostModel itemData
)
{
//store itemData into repository
}

这应该差不多就是全部了。编辑器模板将负责为绑定(bind)工作生成正确的输入字段名称。

关于c# - 如何在 MVC3 中将嵌套的 ViewModel 从 View 绑定(bind)到 Controller?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5700558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com