2012-10-26 133 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