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 表单(假设家里有一个花哨的注册表单,没有客户端验证,所以它的花哨布局上没有任何东西被破坏)发布到 Home 控制器中的 Signup 操作。
  2. 如果发布的数据有错误,则会以与当前文化匹配的语言显示。(好的和预期的)。
  3. 通过使用我在客户端中启用的下拉菜单更改语言,该下拉菜单实际上回发到服务器。(我还没有在这里实现PRG模式,所以我看到了关于重新发布相同数据的警告)。
  4. 该视图是使用我选择的语言呈现的,但是验证消息仍然使用它们最初的语言。

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

谢谢!R。

4

1 回答 1

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 方法。

您可以在此处查看我的问题以获取建议的解决方案: 如何控制显示模型验证错误的语言

于 2013-07-16T09:18:28.533 回答