我目前正在开发一个需要支持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;
}
除非发生这种情况,否则一切都按预期工作:
如果我调试处理语言切换的动作过滤器,我可以看到ModelState用原始语言保存错误,所以我猜测验证只在服务器中发生一次。 我想我需要清理ModelState并强制验证,但我想知道这是否是一个hack以及是否有更好的方法来处理这个问题。
谢谢! R上。
答案 0 :(得分: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