【发布时间】: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(如果存在),并相应地设置当前的 culture 和 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.
【问题讨论】:
标签: asp.net-mvc c#-4.0 localization asp.net-mvc-4 currentuiculture