Asp.net 如何创建自定义数据批注验证器

Asp.net 如何创建自定义数据批注验证器,asp.net,asp.net-mvc-2,data-annotations,Asp.net,Asp.net Mvc 2,Data Annotations,希望创建自定义数据批注验证。是否有关于如何创建它们的有用指南/示例 首先: 带最小和最大长度的StringLength。我知道.NET4可以做到这一点,但希望在.NET3.5中也能做到这一点,如果可能的话,可以定义最小长度(至少x个字符),最大长度(最多x个字符),或者两者都可以(在x和y个字符之间) 其次: 使用模运算进行验证-如果数字是有效长度,我希望使用模11算法进行验证(我已经在JavaScript中实现了它,所以我想这只是一个简单的移植?) 更新: 解决了第二个问题,就是复制JavaS

希望创建自定义数据批注验证。是否有关于如何创建它们的有用指南/示例

首先:
带最小和最大长度的StringLength。我知道.NET4可以做到这一点,但希望在.NET3.5中也能做到这一点,如果可能的话,可以定义最小长度(至少x个字符),最大长度(最多x个字符),或者两者都可以(在x和y个字符之间)

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

更新:

解决了第二个问题,就是复制JavaScript实现并进行一些调整,因此不需要解决这个问题。

要创建自定义数据注释验证程序,请遵循以下Gudeline:

  • 您的类必须继承自
    System.ComponentModel.DataAnnotations.ValidationAttribute
    class
  • 重写
    boolisvalid(对象值)
    方法并在其中实现验证逻辑
  • 就这样

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

    例子 当一个特定的属性没有设置时,它的值在构造函数中设置,所以它总是有一个值。在上面的使用示例中,我特意添加了
    必需的
    验证器,因此它与我编写的上面的小心保持同步

    重要的 因此,此验证器仍将处理不需要的模型值,但当它存在时,它将进行验证(想想web表单中的文本字段,这不是必需的,但如果用户在中输入值,它必须是有效的)。

    将与带有签名的验证函数一起使用

    public static ValidationResult Validate(MyType x, ValidationContext context)
    
    示例(用于字符串属性)


    那么,如果为空值,isValid是否应返回true?那么如何添加额外选项,例如
    [MyValidator(Min=1,Max=20)]
    ,其中Min/Max(或仅一个)都是可选的?@onof:Yes。在这种情况下,它应该返回
    true
    @Sam:我编辑了我的答案,并包含了一个示例,说明了您在第一个场景中的具体操作。@Rap它在MVC 5中对我有效。ValidationContext参数用于什么?@petryuno1如果您碰巧需要查看vlaidation中的其他属性,您可以使用它来获取模型。e、 例如,var模型=(MyClass)context.ObjectInstance;
    [Required]
    [StringLengthRange(Minimum = 10, ErrorMessage = "Must be >10 characters.")]
    
    [StringLengthRange(Maximum = 20)]
    
    [Required]
    [StringLengthRange(Minimum = 10, Maximum = 20)]
    
    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;
        }
    }