第一个 html 帮助程序生成客户端验证属性,而第二个则不

First html helper generates client-side validation attributes, while the second one doesn't

假设我有这个模型:

public class Person
{
    public bool IsApproved { get; set; }
}

我正在尝试使用 check 类型渲染 input 并编写此代码:

@Html.CheckBoxFor(x => x.IsApproved)
@Html.CheckBox("IsApproved")

但是,结果不一样:

// CheckBoxFor result
<input data-val="true" data-val-required="The IsApproved field is required." id="IsApproved" name="IsApproved" type="checkbox" value="true">
<input name="IsApproved" type="hidden" value="false">

// CheckBox result
<input id="IsApproved" name="IsApproved" type="checkbox" value="true">
<input name="IsApproved" type="hidden" value="false">

如何以及为什么,第一个生成用于客户端验证的属性,而另一个没有?

更新:

交换 @Html.CheckBoxFor@Html.CheckBox 的顺序后,标记元素的顺序没有改变。

CheckBox() 帮助程序不会呈现 data-val 属性,因为表单已经呈现 CheckBoxFor() 相同的 属性。如果交换顺序,data-val 属性将呈现为 CheckBox()(而不是 CheckBoxFor())。

我的理解是,这会导致 jquery.validation.unobtrusive 在解析表单时出现潜在(重复)问题。

控件的 html 助手在内部调用 HtmlHelperGetUnobtrusiveValidationAttributes() 方法。 From the source code(我强调)

Only render attributes if unobtrusive client-side validation is enabled, and then only if we've never rendered validation for a field with this name in this form. Also, if there's no form context, then we can't render the attributes (we'd have no to attach them to)

public IDictionary<string, object> GetUnobtrusiveValidationAttributes(string name, ModelMetadata metadata)
{