通过DataAnnotations创建自定义validation?

好的,当我想要validation属性时,我可能会写这样的东西:

[Required] [StringLength(255)] [DataType(DataType.EmailAddress)] [RegularExpression(RegexStrings.Email, ErrorMessage = "Email is not valid.")] [DataMember(IsRequired = true, Name="Email", Order = 1)] public string Email { get; set; } 

我喜欢这个,因为在这种情况下,我将它指向我们在公共库中的正则表达式字符串,如果失败则指定错误消息。 简单干净。

我的情况是这样的。 这是在WCF RESTful服务中。 我想以这种方式validation的其中一个属性需要使用自定义方法进行validation,该方法使用某些业务逻辑进行validation(它检查字符串长度和字节长度)。 我可以(以及我如何)设置此自定义validation,以便我可以像上面的示例中那样使用它; 所以它看起来像:

 [StreamValidation(ValidationClass, ErrorMessage = "Serial number is invalid")] public string Ksn { get; set; } 

更新:

我构建了以下类作为我的属性:

 [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class KsnValidation : ValidationAttribute { public override bool IsValid(object value) { if (!(value is string)) return false; var val = (string) value; var bytes = Enumerable .Range(0, val.Length / 2) .Select(x => Byte.Parse(val.Substring(2 * x, 2), NumberStyles.HexNumber)) .ToArray(); return val.Length == 20 && bytes.Length == 10; } public override string FormatErrorMessage(string name) { return base.FormatErrorMessage(name); } } 

然后装饰以下属性:

 [KsnValidation(ErrorMessage = "Wrong Name")] public string Ksn { get; set; } 

但我不知道如何对此进行unit testing

这个SO答案给出了MVC2的答案。

这是MVC3及以上的post 。

基本上你创建一个属性:

 public class MyValidationAttribute: ValidationAttribute { public MyValidationAttribute() { } protected override ValidationResult IsValid( object value, ValidationContext validationContext) { ... if (somethingWrong) { return new ValidationResult(errorMessage); } return null; // everything OK } } 

ValidationAttribute的文档显示了如何创建自定义validation属性。