使用@Html.EditorFor出现重复name属性的问题求助
这个问题其实是因为你误解了EditorFor辅助方法的工作机制——它是强类型绑定优先的,会自动根据模型属性生成用于模型绑定的name属性,而你手动添加的@Name属性(不管大小写)会被额外输出,导致HTML中出现重复的name定义(HTML属性大小写不敏感,所以Name和name会被视为同一属性的重复)。
问题根源
当你使用EditorFor(model => model.User_Name)时,辅助方法默认会生成与模型属性匹配的name="User_Name",这是为了表单提交时能正确绑定到后端的model.User_Name字段。而你在htmlAttributes里手动指定了@Name = "txtFullNameRealtor",这会让辅助方法在输出HTML时,同时保留自动生成的name和你手动添加的Name,最终导致重复属性,触发W3C验证错误。
解决方案
根据你的需求,分两种情况处理:
1. 需要保留模型绑定(推荐)
如果你需要表单提交时自动绑定到model.User_Name,不要手动指定name属性,只保留其他必要属性即可。修改后的代码:
@Html.EditorFor(model => model.User_Name, new { htmlAttributes = new { @class = "form-control", id = "txtFullNameRealtor", placeholder = "Full Name" } })
这样生成的HTML会只有一个name="User_Name",既符合W3C规范,又能正常实现模型绑定。如果需要通过JS操作这个输入框,用id="txtFullNameRealtor"就足够了,不需要依赖name属性。
2. 不需要模型绑定,自定义name属性
如果你的场景不需要模型绑定,只是需要一个自定义name的输入框,建议改用Html.TextBox辅助方法,它允许你完全自定义name属性:
@Html.TextBox("txtFullNameRealtor", model.User_Name, new { @class = "form-control", id = "txtFullNameRealtor", placeholder = "Full Name" })
这个方法会直接生成你指定的name="txtFullNameRealtor",不会额外添加模型属性对应的name。
额外提醒
永远不要在强类型辅助方法(比如EditorFor、TextBoxFor)中手动指定name属性,这不仅会导致HTML验证错误,还可能破坏模型绑定的逻辑。强类型辅助方法的name属性是为了和后端模型一一对应,这是ASP.NET MVC表单绑定的核心机制之一。
内容的提问来源于stack exchange,提问作者Ayush

