1

我目前正在研究需要支持2種語言的MVC4應用程序。 我在使用形式DataAnnotations與資源:更改文化後驗證錯誤消息不會更改

public class SignupModel 
{ 
    [Required(ErrorMessageResourceName = "Registration_ValidEmailRequired", ErrorMessageResourceType = typeof(Validation))] 
    [Email(ErrorMessageResourceName = "Registration_ValidEmailRequired", ErrorMessageResourceType = typeof(Validation))] 
    public string Email { get; set; } 

    [Required(ErrorMessageResourceName = "Registration_PasswordRequired", ErrorMessageResourceType = typeof(Validation))] 
    [StringLength(100, MinimumLength = 8, ErrorMessageResourceName = "Registration_PasswordInvalidLength", ErrorMessageResourceType = typeof(Validation))] 
    [DataType(DataType.Password)] 
    public string Password { get; set; } 
} 

我創建了一個全球行動過濾如果存在讀語言的cookie,並相應地設置當前文化的UICulture 。如果該cookie不存在,它會使用當前文化創建cookie。這是OnActionExecuting看起來像在過濾器:

public void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var langCookie = GetOrSetLanguageCookie(filterContext.HttpContext); 
    var culture = new CultureInfo(langCookie.Value); 

    Thread.CurrentThread.CurrentCulture = culture; 
    Thread.CurrentThread.CurrentUICulture = culture; 
} 

一切正常,除了當這種情況發生:

  1. 後從HTML表單(比方說在家裏用花哨的註冊表格沒有客戶端驗證,因此它的花式佈局中沒有任何內容被破壞)到主控制器中的註冊操作。
  2. 如果發佈的數據有錯誤,它們將以與當前文化相匹配的語言顯示。 (好和預期)。
  3. 更改語言,方法是使用客戶端中啓用的下拉菜單,這些下拉菜單實際上會回發到服務器。 (我還沒有在這裏實施過這個模式,所以我看到了關於重新發布相同數據的警告)。
  4. 視圖以我選擇的語言呈現,但驗證消息仍保留與它們最初相同的語言。

如果我調試處理語言切換的動作過濾器,我可以看到ModelState以原始語言保存錯誤,所以我的猜測是驗證只發生在服務器中一次。 我想我需要清理模型狀態並強制驗證,但我想知道這是否是一種黑客攻擊,以及是否有更好的方法來處理這個問題。

謝謝! R.

回答

1

讀肖恩·許的帖子在這裏: http://geekswithblogs.net/shaunxu/archive/2010/05/06/localization-in-asp.net-mvc-ndash-3-days-investigation-1-day.aspx

的模型綁定器(它負責對驗證消息的獲取)的行動之前,其actionfilters運行,這就是爲什麼在你的文化的改變發生確認消息文本被確定並且不受其影響。

您可以嘗試將此代碼移到較早的擴展點,例如控制器的Execute或ControllerFactory的CreateController方法。

你可以在這裏看到我的問題提出了一個解決方案: How to control the language in which model validation errors are displayed

相關問題