2012-10-26 63 views
2

好了,所以我希望有一个属性来验证,我可能会写这样的事:通过DataAnnotations创建自定义验证?

[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服务中。我想验证这种方式需要使用自定义方法验证使用某些业务逻辑(它检查字符串长度和字节长度)的属性之一。我可以(以及如何)设置此自定义验证,以便我可以像使用上面的示例一样使用它;所以它看起来是这样的:

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

UPDATE:

我已经构建了下面的类是我的属性:

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

但我不知道如何单元测试这个

回答

3

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

这里是a post为MVC3和up。

基本上你创建一个属性:

public class MyValidationAttribute: ValidationAttribute 
{ 
    public MyValidationAttribute() 
    { } 

    protected override ValidationResult IsValid(
      object value, ValidationContext validationContext) 
    { 

     ... 
     if (somethingWrong) 
     { 
      return new ValidationResult(errorMessage); 
     } 
     return null; // everything OK 
    } 
} 
+0

我该如何测试?我更新了OP – Sinaesthetic

+0

快速测试会在屏幕上输入错误的数字。我不确定如何进行单元测试,您需要将实体附加到我认为的上下文中。 –

+0

我运行了我的服务并发送了错误的数据,但它从未抛出错误:/ – Sinaesthetic