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