62

我正在尝试更改由@Html.HiddenFor.

我正在使用的代码:

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

现在这适用于id,但它不适用于名称。现在我真的不在乎id现在,我需要name改变,因为那是被发布回目标服务器的那个。

有没有

  • 我可以SomeProperty在我的模型中应用的属性?
  • 一种Html.HiddenFor覆盖name属性的方法?

还是我坚持<input ...>手工做一个简单的?

4

4 回答 4

122

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

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

强类型助手(例如名称以“For”结尾的那个HiddenFor)的目标是从提供的表达式中为您猜测输入名称。因此,如果您想要一个“自定义”输入名称,您始终可以使用常规帮助程序,例如Html.Hidden您可以显式设置名称的位置。

unjuken的答案是错误的,因为它会生成无效的HTML。

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

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

因此,您将拥有Name="some_property" AND name="SomeProperty"这是无效的 HTML,因为输入只能具有一个 name属性!(尽管大多数浏览器碰巧采用第一个Name="some_property"并且不关心第二个......)

于 2013-02-11T10:22:53.983 回答
37

如果您使用:

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

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

于 2013-06-05T13:26:04.763 回答
4

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

我查看了最新的 MVC 源代码以了解发生了什么。考虑以下GenerateInput方法中的片段DefaultHtmlGenerator.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);

我们可以在这里看到,问题在于,无论您提供什么 name 属性,它都会被最后一次调用覆盖MergeAttribute,这将使用fullNameGetFullHtmlFieldName方法分配给变量的任何逻辑。

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

无论如何,为了实现这一点,我说只需手动构造输入元素而不使用剃刀视图助手。

于 2017-02-22T17:51:52.417 回答
1

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

我用平原

<input type="hidden" id="@myid" name="@myname" value="@Model.prop" />

并像魅力一样工作。不需要 HtmlHelper HiddenForModel。

于 2019-02-25T19:23:33.553 回答