我目前正在研究需要支持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;
}
一切正常,除了當這種情況發生:
- 後從HTML表單(比方說在家裏用花哨的註冊表格沒有客戶端驗證,因此它的花式佈局中沒有任何內容被破壞)到主控制器中的註冊操作。
- 如果發佈的數據有錯誤,它們將以與當前文化相匹配的語言顯示。 (好和預期)。
- 更改語言,方法是使用客戶端中啓用的下拉菜單,這些下拉菜單實際上會回發到服務器。 (我還沒有在這裏實施過這個模式,所以我看到了關於重新發布相同數據的警告)。
- 視圖以我選擇的語言呈現,但驗證消息仍保留與它們最初相同的語言。
如果我調試處理語言切換的動作過濾器,我可以看到ModelState以原始語言保存錯誤,所以我的猜測是驗證只發生在服務器中一次。 我想我需要清理模型狀態並強制驗證,但我想知道這是否是一種黑客攻擊,以及是否有更好的方法來處理這個問題。
謝謝! R.