ASP.NET MVC 4覆盖了发出的html名称和id

问题描述 投票:52回答:4

我正在尝试更改@Html.HiddenFor创建的html输入的发出名称。

我正在使用的代码:

@Html.HiddenFor(e => e.SomeProperty, new { @id = "some_property", @name = "some_property" }

现在这适用于id,但它不适用于名称。现在我现在并不关心id,我需要更改name,因为那是将其发布回目标服务器的那个。

在那儿

  • 我可以在我的模型中使用SomeProperty的属性吗?
  • Html.HiddenFor中覆盖name财产的方式?

或者我坚持用手做一个普通的<input ...>

asp.net-mvc asp.net-mvc-4 razor-2
4个回答
105
投票

你需要使用Html.Hidden(或用手写出<input ...>)而不是Html.HiddenFor

@Html.Hidden("some_property", Model.SomeProperty, new { @id = "some_property" })

强类型助手的目标(例如,名称为“For”的那个,如HiddenFor)是从提供的表达式中猜出你的输入名称。因此,如果您想要一个“自定义”输入名称,您可以随时使用常规帮助程序,如Html.Hidden,您可以在其中明确设置名称。

answer from unjuken错误,因为它生成无效的HTML。

使用该解决方案生成两个name属性:

<input  Name="some_property"  name="SomeProperty" id="some_property" type="hidden" value="test" /> 

所以你将有Name="some_property"name="SomeProperty"这是无效的HTML,因为输入只能有一个name属性! (虽然大多数情人碰巧拿第一个Name="some_property"而不关心第二个......)


36
投票

如果您使用:

@ Html.HiddenFor(e => e.SomeProperty,new {@id =“some_property”,@ Name =“some_property”});

注意@Name中的大写“N”。它会工作。


3
投票

我很好奇为什么专门覆盖name属性不起作用。除非我把它(即new {@Name = 'somename'})资本化,否则它似乎不起作用。正如其他人所指出的那样,这只会起作用,因为它会生成重复的名称属性,Chrome会对其进行清理。

我查看了最新的MVC源代码,以了解发生了什么。请考虑GenerateInputDefaultHtmlGenerator.cs方法的以下片段:

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覆盖,fullName将使用从GetFullHtmlFieldName方法分配给变量<input type="hidden" id="@myid" name="@myname" value="@Model.prop" /> 的任何逻辑。

我理解为什么他们强制执行这种行为,猜测它与控制回发中使用的名称有关,以保证它与模型绑定器一起使用。

在任何情况下,为了实现这一点,我说只需手动构造输入元素,不要使用剃刀视图助手。


0
投票

从来没有为我工作过(aspnet.core)

我用平原

qazxswpoi

并且像一个魅力。不需要HtmlHelper HiddenForModel。

© www.soinside.com 2019 - 2024. All rights reserved.