【问题标题】:Validation error messages don't change after culture change文化改变后验证错误消息不会改变
【发布时间】:2013-01-22 16:41:10
【问题描述】:

我目前正在开发一个需要支持 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(如果存在),并相应地设置当前的 cultureuiculture。如果 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 表单(假设是家庭中的精美注册表单,没有客户端验证,因此其精美布局上没有任何内容被破坏)发布到 Home 控制器中的 Signup 操作。
  2. 如果发布的数据有错误,则会以与当前文化相匹配的语言显示。 (很好,符合预期)。
  3. 通过使用我在客户端中启用的下拉菜单更改语言,该下拉菜单实际上回发到服务器。 (我还没有在这里实现 PRG 模式,所以我看到了关于重新发布相同数据的警告)。
  4. 视图使用我选择的语言呈现,但验证消息仍使用最初的语言。

如果我调试处理语言切换的操作过滤器,我可以看到 ModelState 以原始语言保存错误,所以我的猜测是验证只在服务器中发生一次。 我想我需要清理 ModelState 并强制验证,但我想知道这是否是一个 hack,是否有更好的方法来处理这个问题。

谢谢! R.

【问题讨论】:

    标签: asp.net-mvc c#-4.0 localization asp.net-mvc-4 currentuiculture


    【解决方案1】:

    在此处阅读 Shaun Xu 的帖子: http://geekswithblogs.net/shaunxu/archive/2010/05/06/localization-in-asp.net-mvc-ndash-3-days-investigation-1-day.aspx

    ModelBinder(负责获取验证消息)在操作之前和操作过滤器之前运行,这就是为什么您的文化更改发生在验证消息文本确定之前并且不受其影响的原因。

    您可以尝试将此代码移至较早的扩展点,例如控制器的 Execute 或 ControllerFactory 的 CreateController 方法。

    您可以在此处查看我的问题以获取建议的解决方案: How to control the language in which model validation errors are displayed

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多