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

相关问题