想要创建自定义数据注释验证。有没有什么有用的指南/样本如何创建?
首先:
带有最小和最大长度的StringLength。我知道.NET 4可以做到这一点,但想在.NET 3.5中做同样的,如果可能的话,只能定义最小长度(至少x chars),最大长度(最多x个字符),或两者(x和y字符之间)。
其次:
验证使用模运算 – 如果数字是一个有效的长度,我希望验证使用Modulus 11算法(我已经在JavaScript中实现它,所以我想它只是一个简单的移植?)
解决方法
要创建自定义数据注记验证器,请按照以下gudelines:
>你的类必须继承System.ComponentModel.DataAnnotations.ValidationAttribute类。
>覆盖bool IsValid(对象值)方法并在其中实现验证逻辑。
而已。
重要警告
有时开发人员检查该值不为null / empty并返回false。这通常是不正确的行为,因为它在必需的验证器检查哪个意味着您的自定义验证器应该只验证非空数据,但返回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)]
当未设置特定属性时,其值在构造函数中设置,因此它始终具有值。在上面的使用示例中,我故意添加了所需的验证器,所以它与我写的上述警告同步。
重要
所以这个验证器仍然可以处理你不需要的模型值,但是当它存在时,它会验证(在Web表单中考虑一个文本字段,这不是必需的,但是如果用户输入一个值,它必须是有效的) 。