如何创建自定义数据注释验证器

时间:2010-08-05 10:13:56

标签: asp.net asp.net-mvc-2 data-annotations

想要创建自定义数据注释验证。是否有关于如何创建它们的有用指南/示例?

首先:
具有最小和最大长度的StringLength。我知道.NET 4可以做到这一点,但是想在.NET 3.5中做同样的事情,如果可能的话,只能定义最小长度(至少x个字符),最大长度(最多x个字符),或者两者都是(在x和y之间)。

其次:
使用模数运算验证 - 如果数字是有效长度,我希望使用模数11算法进行验证(我已经在JavaScript中实现了它,所以我想它只是一个简单的移植?)

更新
解决了第二个问题,只是复制JavaScript实现并做了一些调整,所以不需要解决方案。

2 个答案:

答案 0 :(得分:87)

要创建自定义数据注释验证器,请遵循以下指南:

  1. 您的班级必须继承System.ComponentModel.DataAnnotations.ValidationAttribute班。
  2. 覆盖bool IsValid(object value)方法并在其中实现验证逻辑。
  3. 就是这样。

    重要注意事项

    有时开发人员会检查该值是否为null / empty并返回false。这是通常不正确的行为,因为它在Required验证器上检查哪个意味着您的自定义验证器应该只验证非空数据,否则返回true(参见示例)。这将使它们可用于强制(必需)和非必填字段。

    实施例

    public class StringLengthRangeAttribute : ValidationAttribute
    {
        public int Minimum { get; set; }
        public int Maximum { get; set; }
    
        public StringLengthRangeAttribute()
        {
            this.Minimum = 0;
            this.Maximum = int.MaxValue;
        }
    
        public override bool IsValid(object value)
        {
            string strValue = value as string;
            if (!string.IsNullOrEmpty(strValue))
            {
                int len = strValue.Length;
                return len >= this.Minimum && len <= this.Maximum;
            }
            return true;
        }
    }
    

    可以在属性中设置所有属性,以便设置它们 一些例子:

    [Required]
    [StringLengthRange(Minimum = 10, ErrorMessage = "Must be >10 characters.")]
    
    [StringLengthRange(Maximum = 20)]
    
    [Required]
    [StringLengthRange(Minimum = 10, Maximum = 20)]
    

    如果未设置特定属性,则其值在构造函数中设置,因此它始终具有值。在上面的用法示例中,我还故意添加了Required验证器,因此它与我编写的上述警告同步。

    重要

    因此,此验证器仍然可以处理您不需要的模型值,但是当它存在时,它会验证(想想Web表单中的文本字段,这不是必需的,但如果用户输入值,则必须是有效的。)

答案 1 :(得分:4)

CustomValidationAttribute与带签名的验证功能一起使用

public static ValidationResult Validate(MyType x, ValidationContext context)

示例(对于字符串属性)

using System.ComponentModel.DataAnnotations;

public class MyClass
{
    [CustomValidation(typeof(MyClass), "Validate")]
    public string MyProperty { get; set; }

    public static ValidationResult Validate(string x, ValidationContext context)
    {
        return (x == "valid")
            ? new ValidationResult(null)
            : ValidationResult.Success;
    }
}
相关问题