第一个html助手生成客户端验证属性,而第二个不生成

Far*_*yev 7 c# asp.net-mvc unobtrusive-javascript razor asp.net-mvc-4

假设我有这个模型:

public class Person
{
    public bool IsApproved { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并且这个代码,我试着inputcheck类型渲染:

@Html.CheckBoxFor(x => x.IsApproved)
@Html.CheckBox("IsApproved")
Run Code Online (Sandbox Code Playgroud)

但是,结果是不同的:

// 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">
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

小智 9

CheckBox()助手不渲染data-val,因为形式已经呈现属性,CheckBoxFor()同一属性.如果您交换订单,data-val将为CheckBox()(而不是CheckBoxFor())呈现属性.

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

控件的html助手在内部调用GetUnobtrusiveValidationAttributes()方法HtmlHelper.从源代码(我的重点)

如果启用了不显眼的客户端验证,则仅渲染属性,并且仅当我们从未在此表单中对具有此名称的字段进行验证时才显示属性.此外,如果没有表单上下文,那么我们无法呈现属性(我们没有将它们附加到)

public IDictionary<string, object> GetUnobtrusiveValidationAttributes(string name, ModelMetadata metadata)
{
Run Code Online (Sandbox Code Playgroud)