我正在尝试更改@Html.HiddenFor
创建的html输入的发出名称。
我正在使用的代码:
@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" })
强类型助手的目标(例如,名称为“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"
而不关心第二个......)
如果您使用:
@ Html.HiddenFor(e => e.SomeProperty,new {@id =“some_property”,@ Name =“some_property”});
注意@Name中的大写“N”。它会工作。
我很好奇为什么专门覆盖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);
我们可以在这里看到,问题在于,无论你提供什么名称属性,它都将被最后一次调用MergeAttribute
覆盖,fullName
将使用从GetFullHtmlFieldName
方法分配给变量<input type="hidden" id="@myid" name="@myname" value="@Model.prop" />
的任何逻辑。
我理解为什么他们强制执行这种行为,猜测它与控制回发中使用的名称有关,以保证它与模型绑定器一起使用。
在任何情况下,为了实现这一点,我说只需手动构造输入元素,不要使用剃刀视图助手。
从来没有为我工作过(aspnet.core)
我用平原
qazxswpoi
并且像一个魅力。不需要HtmlHelper HiddenForModel。