当我的表单中有一个复选框时,将匹配属性标记为必需是不够的,因为它的值是发送true或false。
在模型中验证这一点的最佳方法是什么?我正在考虑使用正则表达式来匹配字符串true,但我要么没有正确编写它,要么它对布尔属性不起作用。
public bool FeeAgree
{
get
{
return _feeAgree;
}
set
{
_feeAgree = value;
}
}
以上是我要验证的属性。使用Required属性不起作用,因为Html.CheckBoxFor创建一个隐藏字段,因此总是传递true或false值。
答案 0 :(得分:2)
布尔属性不需要任何数据注释。如果值不是true
或false
,则默认模型绑定器将在尝试解析它并添加模型错误时处理该情况。所以基本上只有拥有这样的模型属性才能接受true
或false
。每隔一个值都会被视为错误。
如果您使用的是可以为空的布尔值,则可以强制它使用具有Required
属性的值:
[Required]
public bool? FeeAgree { get; set; }
为确保用户选中该复选框,您可以编写自定义验证属性:
public class MustBeTrueAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
return value != null && (bool)value;
}
}
然后:
[MustBeTrue(ErrorMessage = "You must accept the terms and conditions")]
public bool FeeAgree { get; set; }
答案 1 :(得分:1)
此解决方案可以扩展到包括客户端验证。
public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable {
public override bool IsValid(object value) {
return value is bool && (bool)value;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata, ControllerContext context) {
return new ModelClientValidationRule[] {
new ModelClientValidationRule {
ValidationType = "checkboxtrue",
ErrorMessage = this.ErrorMessage
}};
}
}
然后如果视图包含一些jquery代码来添加“checkboxtrue”验证类型......
jQuery.validator.unobtrusive.adapters.add("checkboxtrue", function (options) {
if (options.element.tagName.toUpperCase() == "INPUT" && options.element.type.toUpperCase() == "CHECKBOX") {
options.rules["required"] = true;
if (options.message) {
options.messages["required"] = options.message;
}
}
});
结果是客户端复选框验证