ASP.NET MVC 4覆盖发出的HTML名称和ID
我试图改变由@Html.HiddenFor
创build的HTMLinput的名称。
我使用这个代码:
@Html.HiddenFor(e => e.SomeProperty, new { @id = "some_property", @name = "some_property" }
现在这个工作的id
,但它不起作用的名称。 现在我并不真正关心这个id
,我需要改变这个name
,因为那个是被发回到目标服务器的。
在那儿
- 我可以在我的模型中应用
SomeProperty
属性? - 在
Html.HiddenFor
重写name
属性的一种方法?
还是我坚持做一个纯手工<input ...>
?
你需要使用Html.Hidden (或者用手写出<input ...>
)而不是Html.HiddenFor
@Html.Hidden("some_property", Model.SomeProperty, new { @id = "some_property" })
强types助手的目标(例如,像“ HiddenFor
”这样的名字“For”结束的HiddenFor
)是从提供的expression式中为你猜测input的名字。 所以,如果你想有一个“自定义”的input名称,你总是可以使用像Html.Hidden
这样的常规助手,你可以明确地设置名字。
unjuken接受的答案是错误的,因为它会生成无效的 HTML。
使用该解决scheme将生成两个 name
属性:
<input Name="some_property" name="SomeProperty" id="some_property" type="hidden" value="test" />
所以你将有Name="some_property"
和 Name="some_property"
这是无效的 HTML,因为input只能有一个 name
属性! (虽然大多数浏览器碰巧取第一个Name="some_property"
而不关心第二个…)
如果你使用:
@ Html.HiddenFor(e => e.SomeProperty,new {@id =“some_property”,@Name =“some_property”});
注意@Name中的大写“N”。 这会工作。
我很好奇,为什么重写名称属性不起作用。 除非我将其大写(即new {@Name = 'somename'}
),否则它似乎不起作用。 正如其他人指出的,这只是因为它产生重复的名称属性,Chrome清理它。
我查看了最新的MVC源代码来弄清楚发生了什么事情。 考虑以下来自DefaultHtmlGenerator.cs
GenerateInput
方法的snipper:
var fullName = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression); if (string.IsNullOrEmpty(fullName)) { throw new ArgumentException( ... } var inputTypeString = GetInputTypeString(inputType); var tagBuilder = new TagBuilder("input"); tagBuilder.TagRenderMode = TagRenderMode.SelfClosing; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("type", inputTypeString); tagBuilder.MergeAttribute("name", fullName, replaceExisting: true);
我们可以在这里看到,问题在于,无论您提供的任何名称属性如何,最后一次调用MergeAttribute
会覆盖它,它将使用从GetFullHtmlFieldName
方法分配给variablesfullName
任何逻辑。
我有点理解为什么他们强制执行这种行为,猜测它与控制回发中使用的名称有关,以保证它与模型联编程序一起工作。
在任何情况下,要做到这一点,我只是说手动构buildinput元素,不要使用剃刀视图帮手。