如何创build自定义数据注释validation器

想要创build自定义数据注释validation。 是否有任何有用的指导/样本如何创build它们?

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

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

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

要创build自定义数据注释validation器,请按照以下指示进行操作:

  1. 你的类必须从System.ComponentModel.DataAnnotations.ValidationAttribute类inheritance。
  2. 重写bool IsValid(object value)方法并在其中实现validation逻辑。

而已。

重要注意

有时开发人员检查该值不为空/空并返回false。 这通常是不正确的行为,因为这是Requiredvalidation器来检查哪些手段您的自定义validation器应该只validation非空数据,否则返回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)] 

当一个特定的属性没有设置,它的值在构造函数中设置,所以它总是有一个值。 在上面的使用示例中,我故意添加了Requiredvalidation器,因此它与我所写的上述警告同步。

重要

所以这个validation器仍然可以处理你不需要的模型值,但是当它存在时它会validation(想象一下web表单中的文本字段,这不是必需的,但是如果用户input一个值,它必须是有效的) 。

CustomValidationAttribute与具有签名的validation函数一起使用

 public static ValidationResult Validate(MyType x, ValidationContext context) 

示例(对于string属性)

 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; } }