Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC3中为控件ID添加前缀以确保唯一性。回发到服务器时,我丢失了所有数据_C#_Asp.net Mvc 3_Model - Fatal编程技术网

C# 在MVC3中为控件ID添加前缀以确保唯一性。回发到服务器时,我丢失了所有数据

C# 在MVC3中为控件ID添加前缀以确保唯一性。回发到服务器时,我丢失了所有数据,c#,asp.net-mvc-3,model,C#,Asp.net Mvc 3,Model,我正在尝试解决以下场景中的问题: 用户加载页面并加载EditorTemplate ViewModel 用户在页面上打开一个对话框 此对话框在其中加载相同的EditorTemplate ViewModel 由于DOM树中存在每个控件的多个实例,因此控件ID现在是非唯一的 我的解决方案是向控制器指示我希望在对话框中构建ViewModel。我通过指示应该附加到生成的控件ID上的“前缀”字符串来实现。我采纳了他的建议 因此,我在ViewModel中声明了一个控件: <%--This will

我正在尝试解决以下场景中的问题:

  • 用户加载页面并加载EditorTemplate ViewModel
  • 用户在页面上打开一个对话框
  • 此对话框在其中加载相同的EditorTemplate ViewModel
  • 由于DOM树中存在每个控件的多个实例,因此控件ID现在是非唯一的
我的解决方案是向控制器指示我希望在对话框中构建ViewModel。我通过指示应该附加到生成的控件ID上的“前缀”字符串来实现。我采纳了他的建议

因此,我在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>
<% } %>
这样行。它具有修改控件ID的效果。它呈现为“prefix_Name”而不是“Name”

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

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

问题分两部分:

  • 这是实现我期望效果的正确途径吗
  • 我怎样才能通知MVC ID已经被修改,这样我就可以恢复JSON到模型的转换

您提到的MVC转换魔法是使用MVC模型绑定器完成的。默认模型绑定器不会以这种方式处理前缀,因为它没有意识到前缀的存在。您可以通过如下方式注释控制器动作来了解它:

public ActionResult SomeAction([Bind(Prefix = "SomePrefix")] ViewModel model){...}
有关这方面的更多信息,请参阅本文:

我假设这是一个常量,是吗?所以我需要分离控制器的SomeAction,这取决于我希望传递给控制器的ViewModel的哪个前缀?是的,它将是常量,但这实际上应该是一种边缘情况。如果您将要遇到很多情况,请考虑将视图模型更改为具有一个需要的所有信息的复合对象。
public ActionResult SomeAction([Bind(Prefix = "SomePrefix")] ViewModel model){...}