【问题标题】:MVC: Set Name Attribute w/HelperMVC:设置名称属性 w/Helper
【发布时间】:2012-05-11 11:31:11
【问题描述】:

我在 MVC3 应用程序中遇到一种情况,我希望能够在一些由帮助程序 (DropDownList) 生成的 html 上设置 name 属性。

看来这是不可能的。显然,助手会默默地覆盖您为传递给助手的 html 属性对象中的 name 属性指定的任何值。

在我浪费太多时间尝试与现有助手合作之前,我想确认一下。

而且,顺便说一句,如果设计上不可能......我认为这是 MVC 框架中的一个愚蠢的限制。是的,我知道分配错误的名称属性会破坏自动模型绑定。但是当我需要的时候,我应该能够做到这一点。毕竟,我总是可以使用我选择的任何名称属性来编写原始 html。帮助者应该提供帮助,而不是束手无策。

编辑讨论编辑器模板是否维护导航上下文

Darin,我正在使用编辑器模板(我通常使用术语“部分”,因为编辑器模板是一种特殊的部分视图)。

编辑器模板修改 HtmlFieldPrefix -- 这就是我注意到我有问题的方式:)。我正在使用这样的电话:

// call in higher level partial - context is 'eae'
@Html.EditorFor(m => m.Value)
...
// inside editor template for typeof(Value) context is 'eae:Value'

需要上下文转换来保持默认绑定机制正常工作。我使用了一种不同的方法,我希望上下文在整个调用链中保持固定(即,当执行深入到更深的部分时,我希望上下文保持不变)。

【问题讨论】:

  • 我想您使用的是 DropDownListFor 而不是 DropDownList,对吗? DropDownList 确实允许您指定名称
  • 尼克,我正在使用 DropDownList(来自自定义帮助程序,它自动从我的数据层创建选择列表)。但是,您在调用 DropDownList 时指定的名称值会使用当前的 ViewData.TemplateInfo.HtmlPrefix 进行修饰。您不能通过指定包含 name=... 属性的 html 属性对象来覆盖它。

标签: asp.net-mvc


【解决方案1】:

这是设计使然。 HTML 帮助程序不允许您覆盖 name 属性。它们根据您的视图模型生成名称,以便在提交表单时,默认模型绑定器能够根据完善的约定正确绑定值。

而且,顺便说一句,如果设计上不可能......我认为这是一个 MVC 框架中的愚蠢限制。

您可以在 MS Connect 上打开一张票,并希望这可以在框架的未来版本中改变。在此之前,您还可以编写自己的自定义助手,以便在需要此类功能的情况下覆盖 name 属性。到目前为止,我个人从未需要它,但我相信你有正当的理由。另一种可能性是在服务器上编写自定义模型绑定器。

【讨论】:

  • 谢谢,我知道这些替代方案。与键入 new { id = "you_let_me_do_this" name="why_wont_you_let_me_do_this" } 相比,它们非常困难 :)。顺便说一句,我想出了解决我的问题的方法。这是由框架在调用局部视图时默默更改 ViewData.TemplateInfo 上的 HtmlPrefix 属性引起的。我添加了一个手动覆盖以强制前缀成为我希望它位于每个导致我问题的部分顶部的前缀。问题解决了......如果有点不直观:)。
  • 如果您使用编辑器模板而不是部分模板,则无需设置 HtmlFieldPrefix,因为编辑器模板会自动保留导航上下文。
  • 达林,我在最初的问题中添加了一些额外的解释,以回应您的反馈。谢谢,顺便说一句。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多