2013-02-20 92 views
7

有三个属性,像这样一个简单的视图模型:布尔属性是必需的

public bool RememberMe { get; set; } 

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

为什么这是否被设置为必填字段?

+0

这与某些旧浏览器中的这个bug无关吗? https://github.com/jzaefferer/jquery-validation/issues/598 – 2013-02-21 02:05:51

+0

您可以使用'bool?'属性或使用隐藏的输入() – 2013-02-21 05:20:29

回答

8

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

public bool? RememberMe { get; set; } 

对于引用类型,应用了许多默认验证规则。如果引用类型不可为空,则默认情况下它是必需的。这方面最好的例证是,如果你使用一个文本框来显示一些属性(不是那种你会在你的网站做的,但良好的用于测试目的):

型号:

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"> 

的NUL标签布尔没有验证属性,而布尔有一个data-val-required标签。 int有一个data-val-required标记和一个data-val-number属性

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

+0

另外请注意,mvc将在回发模型时验证模型,所以如果您将某些模型无法绑定到文本框中的某个布尔值,则ModelState.IsValid将为false,并且会出现ModelState错误。 – 2013-02-21 00:40:50

+0

有趣,但我想现在是有道理的。我注意到在你的例子中你使用的是输入类型文本而不是Html.CheckBoxFor;这是否意味着复选框助手是无用的? – Victor 2013-02-21 16:17:21

+0

我只是使用输入来使示例更清晰。 :-) – 2013-02-21 19:59:09

-2
@Html.CheckBoxFor(c => c.TermsAndConditions, new { required = "required" }) 
@Html.ValidationMessageFor(c => c.TermsAndConditions, "you must agree to terms and conditions of Service.)"