2012-05-25 32 views
0

我正在創建一個自定義屬性驗證,它應該在引發ValidationException時使用指定資源文件中的錯誤字符串。我是否正確地假設如果我拋出一個異常並且不在參數中指定錯誤字符串,它應該使用我在構造函數中指定的ErrorMessageResourceName和ErrorMessageResourceType?拋出本地化ValidationException

using System; 
using System.ComponentModel.DataAnnotations; 
using System.Text.RegularExpressions; 

namespace OurProduct.Util 
{ 
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
    public class UniquenessAttribute : ValidationAttribute 
    { 
     public UniquenessAttribute() 
     { 
      ErrorMessageResourceName = "EmailUniqueError"; 
      ErrorMessageResourceType = typeof (Resources.OurThing); 
     } 

     protected override ValidationResult IsValid(object value) 
     { 
      throw new ValidationException(); 
     } 
    } 
} 
+0

和是的,我知道在這個例子中沒有可能返回ValidationResult.Success,但我知道它的工作;) –

+1

它應該工作,只要OurThing指向生成的強類型資源類,用於查找本地化的字符串等,「EmailUniqueError」是這個類的靜態屬性之一。還要確保在進行測試時驗證所有屬性(如果您使用TryValidateObject,例如確保最後一個參數設置爲true)。但不要扔,只是返回false到IsValid() –

+0

@SimonMourier你能詳細說明你的最後一句話嗎?我使用需要ValidationResult的IsValid版本的原因是因爲我需要查找父對象的其他成員的值來調用服務。問題在於嘗試返回一個ValidationResult.Success時它工作正常,但一個正確的本地化的ErrorMessage時,它不是。 –

回答

2

以下應該工作,提供OurThing指向生成的強類型的資源類,用於查找本地化的字符串等,並"EmailUniqueError"是這個類的靜態屬性之一:

public class UniquenessAttribute : ValidationAttribute 
    { 
     public UniquenessAttribute() 
     { 
      ErrorMessageResourceName = "EmailUniqueError"; 
      ErrorMessageResourceType = typeof (Resources.OurThing); 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      if (failure) // to implement 
       return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
      ... 
     } 
    } 

還要確保在執行測試時驗證所有屬性(例如,如果使用TryValidateObject,請確保最後一個參數設置爲true)。