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元素,不要使用剃刀视图帮手。