2010-08-22 70 views
4

我工作的一個多語言網站,我要本地化大多數ValidationAttribute這樣的驗證錯誤消息爲[Requried]本地化錯誤消息在ASP.NET MVC 2(默認屬性驗證)

我知道可以這樣做Phil Haack已經顯示在這個article

[Required(ErrorMessageResourceType = typeof(Resources), 
ErrorMessageResourceName = "Required")] 

,但我想以自定義錯誤消息,我做我的自定義驗證的方式屬性在這裏:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, 
            AllowMultiple = false, 
            Inherited = true)] 
public sealed class ValidateminRequiredNonalphanumericCharactersAttribute 
: ValidationAttribute 
{ 

    private const string _defaultErrorMessage = // Message From Resource Here (i will be using two variables in this message) 
    private readonly int _minnonalphanumericCharactersCounter = Membership.Provider.MinRequiredNonAlphanumericCharacters; 

    public ValidateminRequiredNonalphanumericCharactersAttribute() 
     : base(_defaultErrorMessage) 
    { 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentUICulture, 
      ErrorMessageString, name, _minnonalphanumericCharactersCounter); 
    } 

    public override bool IsValid(object value) 
    { 
     string valueAsString = value as string; 

     if (String.IsNullOrEmpty(valueAsString)) 
      return false; 

     int nonalphanumericCharactersCounter = 0; 
     char[] password = valueAsString.ToCharArray(); 

     foreach (char c in password) 
     { 
      if (!char.IsNumber(c) && !char.IsLetter(c)) 
       nonalphanumericCharactersCounter++; 
     } 

     return (nonalphanumericCharactersCounter >= _minnonalphanumericCharactersCounter); 
    } 
} 

什麼想法?

回答

3

我想出了它是如何完成的。它非常簡單直接。

我做的是我創建了自己的自定義RequiredAttribute。而不是使用內置的RequiredAttribute

唯一的缺點是你需要自己實現驗證器的邏輯。

我知道有些人可能會認爲重新實現已經存在的東西是頭重腳輕的。 (重新發明輪子),但這樣我將完全控制驗證器邏輯和錯誤消息。

正如您所見,該邏輯在下面的IsValid()方法中實現。

下面是我創建了RequiredAttribute標籤類:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, 
             AllowMultiple = true, 
             Inherited = true)] 
public sealed class RequiredAttribute : ValidationAttribute 
{ 
    private const string _defaultErrorMessage = // Error Message 
    // Notice that i can include the filed name in the error message 
    // which will be provided in the FormatErrorMessage Method 

    public RequiredAttribute() 
     : base(_defaultErrorMessage) 
    { 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
      name); 
    } 

    public override bool IsValid(object value) 
    { 
     if (value == null || String.IsNullOrWhiteSpace(Convert.ToString(value))) 
      return false; 
     else 
      return true; 
    } 
} 

現在,當涉及到使用驗證,您需要提供您的新類的完整參考,因爲它會內置在默認碰撞System.ComponentModel.DataAnnotations.RequiredAttribute在我上面的例子中。

在我的情況

,這是最後的結果是什麼樣子:

[Amaly.Data.Validators.Required] 
    public string Username { get; set; } 

希望這是有益的。

+0

當你指出我這個答案後,我複製了你的代碼並將它包含在我的應用程序中,然後發現它有一個令人討厭的錯誤(花了我幾個小時才弄清楚爲什麼用我的自定義屬性進行驗證是奇怪的。該誤差是在isValid()方法此方法應該包含這樣的:\t \t \t如果(值== NULL || String.IsNullOrWhiteSpace(value.ToString())){ \t \t \t \t返回假; \t \t \t } \t \t \t return true; – mare 2011-02-02 01:25:10

+0

請改正原因。重點是刪除字符串轉換導致其各種值類型的問題。 – mare 2011-02-02 01:25:41

+0

@mare感謝您修復我的錯誤代碼,,,我想我沒有這個問題bcoz我只用原始類型使用我的Validator。 – 2011-02-02 11:13:47

相關問題