Asp.Net MVC验证注释正则表达式属性

时间:2011-02-02 18:20:13

标签: asp.net-mvc-3

当我的表单中有一个复选框时,将匹配属性标记为必需是不够的,因为它的值是发送true或false。

在模型中验证这一点的最佳方法是什么?我正在考虑使用正则表达式来匹配字符串true,但我要么没有正确编写它,要么它对布尔属性不起作用。

public bool FeeAgree
    {
        get
        {
            return _feeAgree;
        }
        set
        {
            _feeAgree = value;
        }
    }

以上是我要验证的属性。使用Required属性不起作用,因为Html.CheckBoxFor创建一个隐藏字段,因此总是传递true或false值。

2 个答案:

答案 0 :(得分:2)

布尔属性不需要任何数据注释。如果值不是truefalse,则默认模型绑定器将在尝试解析它并添加模型错误时处理该情况。所以基本上只有拥有这样的模型属性才能接受truefalse。每隔一个值都会被视为错误。

如果您使用的是可以为空的布尔值,则可以强制它使用具有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;
        }
    }
});

结果是客户端复选框验证