2011-03-24 61 views
2

這是我們MVC 2.NET MVC:本地化RequiredAttribute標籤(沒有資源文件)

面臨.NET我們正在嘗試使用DataAnnotations照顧模型驗證我們的問題,就像它應該的那樣。我們遇到的唯一問題是我們不需要標準錯誤消息(因爲我們的網站上有多種語言)。

我們希望本地化,但網站的設置方式是所有文本都來自數據庫。所以我們希望在數據庫中也有我們的錯誤消息。

所以我們寫了一個定製RequiredAttribute標籤,就像這樣:

public class LocalizedRequiredAttribute : RequiredAttribute 
{ 
    public string LocalizedErrorMessage 
    { 
     get 
     { 
      return ErrorMessage; 
     } 
     set 
     { 
      ErrorMessage = value.Translate(); 
     } 
    } 

} 

我們寫的擴展String類添加了「翻譯()」方法,它做必要的數據庫查找正確的本地化版本。

我們用我們的屬性是這樣的:

[LocalizedRequired(LocalizedErrorMessage = "Naam is required")] 
public string Name {get; set; } 

這工作,但只有一次。

如果您先用法語訪問該網站,則會看到法語錯誤消息,指出您應該輸入值。如果您稍後訪問英文網站,您仍然會在英文頁面上看到法文錯誤。安裝員似乎只被調用一次。

我們可以做什麼來防止此行爲,並在每次運行驗證/模型填充值時刷新錯誤消息?

感謝您給我的任何幫助。

回答

2

難道你不能通過將你的.translate()從你的setter移動到你的getter來解決這個問題嗎?這是有道理的,你的二傳手只被調用一次。

編輯: 我認爲ErrorMessage是一個虛擬消息,事實並非如此。

你唯一的選擇可能是創建從數據庫中檢索你的值的Resource類(你不需要一個資源文件)。

 
[Required(ErrorMesageResourceName="FirstName", ErrorMessageResourceType=typeof(ABCResourceClass))] 
public string Name {get; set; } 

class ABCResourceClass{ 
    public static String FirstName{ 
    get{ 
     return Translate("FirstName"); 
    } 
    } 

} 

正如你可以從例如推斷,註釋框架調用與您提供給ErrorMessageResourceName字符串相匹配的名稱的屬性。

如果您有很多屬性,您可以使用某種代碼生成技術來創建ABCResourceClass。

+0

那是不行的,因爲它看起來像吸永遠不會被調用(通過調試測試應用程序)。我想它直接調用RequiredAttribute類中的「ErrorMessage」。 – 2011-03-24 15:59:55

+0

啊。我期待ErrorMessage是虛擬的。原來它不是。你唯一的選擇可能是使用一個資源類(沒有資源文件)。直接編輯答案,因爲我跑出空間 – Naraen 2011-03-24 17:03:44

3

只要使用方法FormatErrorMessage()(WHIS被稱爲每次)設置ErrorMessage財產

但它的hackish

public class ErrorLocalizedRequiredAttribute : RequiredAttribute 
{ 
    public ErrorLocalizedRequiredAttribute(string name) 
    { 
     Name = name; 
    } 

    public string Name 
    { get; set; } 

    public override string FormatErrorMessage(string name) 
    { 
     //get translation from DB by Name 
     ErrorMessage = Localization.Translate(Name); 
     return base.FormatErrorMessage(name); 
    } 
} 
. 
. 
. 
[ErrorLocalizedRequiredAttribute("EmailIsRequired")] 
public string Email 
{ 
    get; set; 
}