我很好奇为什么专门覆盖 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
,这将使用fullName
从GetFullHtmlFieldName
方法分配给变量的任何逻辑。
我有点理解他们为什么要强制执行这种行为,猜测它与控制回发中使用的名称有关,以保证它与模型绑定器一起工作。
无论如何,为了实现这一点,我说只需手动构造输入元素而不使用剃刀视图助手。