想要创建自定义数据注释验证。是否有关于如何创建它们的有用指南/示例?
首先:
具有最小和最大长度的StringLength。我知道.NET 4可以做到这一点,但是想在.NET 3.5中做同样的事情,如果可能的话,只能定义最小长度(至少x个字符),最大长度(最多x个字符),或者两者都是(在x和y之间)。
其次:
使用模数运算验证 - 如果数字是有效长度,我希望使用模数11算法进行验证(我已经在JavaScript中实现了它,所以我想它只是一个简单的移植?)
更新
解决了第二个问题,只是复制JavaScript实现并做了一些调整,所以不需要解决方案。
答案 0 :(得分:87)
要创建自定义数据注释验证器,请遵循以下指南:
System.ComponentModel.DataAnnotations.ValidationAttribute
班。bool IsValid(object value)
方法并在其中实现验证逻辑。就是这样。
有时开发人员会检查该值是否为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;
}
}