Asp.net mvc 不带必需属性的布尔属性是必需的

Asp.net mvc 不带必需属性的布尔属性是必需的,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,有一个简单的ViewModel,具有如下三个属性: public bool RememberMe { get; set; } 在我看来,我有一个简单的@Html.CheckBoxFor(p=>p.RememberMe) 我正在使用Html.EnableClientValidation()启用客户端验证 为什么要将其设置为必填字段?请尝试一个可为空的布尔值 public bool? RememberMe { get; set; } 对于引用类型,应用了许多默认验证规则。如果引用类型不可为nul

有一个简单的ViewModel,具有如下三个属性:

public bool RememberMe { get; set; }
在我看来,我有一个简单的
@Html.CheckBoxFor(p=>p.RememberMe)
我正在使用
Html.EnableClientValidation()启用客户端验证

为什么要将其设置为必填字段?

请尝试一个可为空的布尔值

public bool? RememberMe { get; set; }
对于引用类型,应用了许多默认验证规则。如果引用类型不可为null,则默认情况下它是必需的。最好的例子是,如果您使用文本框来显示某些属性(这不是您在站点中要做的事情,但对于测试目的很好):

型号:

public bool? MyBool { get; set; }
public int MyInt { get; set; }
视图:

 @Html.TextBoxFor(p => p.MyBool)
 @Html.TextBoxFor(p => p.MyInt)
您可以从视图源查看页面上发生的情况:

<input id="MyNullBool" name="MyNullBool" type="text" value="">
<input data-val="true" data-val-required="The MyBool field is required." id="MyBool" name="MyBool" type="text" value="False">
<input data-val="true" data-val-number="The field MyInt must be a number." data-val-required="The MyInt field is required." id="MyInt" name="MyInt" type="text" value="0">

可为空的bool没有验证属性,而bool有一个
datavalrequired
标记。int有一个
data val required
标记和一个
data val number
属性


当然,在复选框上,这是非常多余的,因为它只能被选中(true)或不被选中(false),因此所需的标记没有多大用处。

还请注意,mvc将在模型发回时验证模型,因此如果您将无法绑定到bool的内容放在文本框中,IsValid将为false,并且有一个ModelState错误。这很有趣,但我认为它现在有意义了。我注意到在您的示例中,您使用的是输入类型文本,而不是Html.CheckBoxFor;这是否意味着复选框助手是无用的?对于
CheckBoxFor
,它会说“不能隐式地将类型'bool'转换为'bool'”。它与某些旧浏览器中的此错误无关,是吗?您可以对属性使用
bool?
,也可以使用隐藏输入()
@Html.CheckBoxFor(c => c.TermsAndConditions, new { required = "required" })
@Html.ValidationMessageFor(c => c.TermsAndConditions, "you must agree to terms and conditions of Service.)"