2

我正在尝试解决以下情况的问题:

  • 用户加载页面并加载 EditorTemplate ViewModel。
  • 用户在页面上打开一个对话框。
  • 此对话框在其中加载相同的 EditorTemplate ViewModel。
  • 由于 DOM 树中存在每个控件的多个实例,控件 ID 现在是非唯一的

我的解决方案是向我的控制器指示我希望在对话框中构建 ViewModel。我通过指示应附加到生成的控件 ID 上的“前缀”字符串来做到这一点。我从这个 StackOverflow 帖子中得到了这个建议。

因此,我在 ViewModel 中声明了一个控件,如下所示:

<%--This will append our model's prefix onto all generated IDs to ensure uniqueness.--%>
<% using (Html.BeginHtmlFieldPrefixScope(Model.Prefix)) { %>
<div class="detailsRow required">
    <%= Html.LabelFor(model => model.Name, Model.NameLabel) %>
    <%= Html.EditorFor(model => model.Name) %>
</div>
<% } %>

在我的模型中:

public NewOrderDetailsModel(string prefix) : this()
{
    Prefix = prefix;
}

这工作正常。它具有修改控件ID的效果。它呈现为“prefix_Name”而不是“名称”。

但是,当我将数据发布到服务器时——我的更改打破了 MVC 的转换魔法:

在此处输入图像描述

如您所见,所有修改了 ID 的属性都返回为 null。

两部分问题:

  • 这是达到我想要的效果的正确道路吗?
  • 如何通知 MVC ID 已被修改,以便我恢复 JSON 到模型的转换?
4

1 回答 1

3

您所说的 MVC Conversion Magic 是使用 MVC Model Binder 完成的。默认模型绑定器不会以这种方式处理前缀,因为它没有意识到前缀的存在。您可以通过像这样注释控制器操作来使其知道:

public ActionResult SomeAction([Bind(Prefix = "SomePrefix")] ViewModel model){...}

有关这方面的更多信息,请参阅这篇文章: ASP.NET MVC 3 模型绑定和表单字段

于 2013-01-23T19:32:24.453 回答