我目前正在开发一个需要支持 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 表单(假设家里有一个花哨的注册表单,没有客户端验证,所以它的花哨布局上没有任何东西被破坏)发布到 Home 控制器中的 Signup 操作。
- 如果发布的数据有错误,则会以与当前文化匹配的语言显示。(好的和预期的)。
- 通过使用我在客户端中启用的下拉菜单更改语言,该下拉菜单实际上回发到服务器。(我还没有在这里实现PRG模式,所以我看到了关于重新发布相同数据的警告)。
- 该视图是使用我选择的语言呈现的,但是验证消息仍然使用它们最初的语言。
如果我调试处理语言切换的操作过滤器,我可以看到 ModelState 以原始语言保存错误,所以我的猜测是验证只在服务器中发生一次。我想我需要清理 ModelState 并强制验证,但我想知道这是否是一个 hack,是否有更好的方法来处理这个问题。
谢谢!R。