Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 验证错误消息不';文化变迁之后,我们不会改变_Asp.net Mvc_C# 4.0_Localization_Asp.net Mvc 4_Currentuiculture - Fatal编程技术网

Asp.net mvc 验证错误消息不';文化变迁之后,我们不会改变

Asp.net mvc 验证错误消息不';文化变迁之后,我们不会改变,asp.net-mvc,c#-4.0,localization,asp.net-mvc-4,currentuiculture,Asp.net Mvc,C# 4.0,Localization,Asp.net Mvc 4,Currentuiculture,我目前正在开发一个需要支持两种语言的MVC4应用程序。 我正在使用数据注释和以下形式的资源: public class SignupModel { [Required(ErrorMessageResourceName = "Registration_ValidEmailRequired", ErrorMessageResourceType = typeof(Validation))] [Email(ErrorMessageResourceName = "Registration_

我目前正在开发一个需要支持两种语言的MVC4应用程序。 我正在使用数据注释和以下形式的资源:

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。这就是过滤器中执行的操作的样子:

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表单(比方说家庭中的一个奇特的注册表单,没有客户端验证,因此其奇特的布局上没有任何内容被破坏)发布到家庭控制器中的注册操作
  • 如果发布的数据有错误,它们将以与当前区域性匹配的语言显示。(很好,很期待)
  • 通过使用我在客户机中启用的下拉列表来更改语言,该下拉列表实际上会发回服务器。(我还没有在这里实现PRG模式,所以我看到了关于重新发布相同数据的警告)
  • 视图是使用我选择的语言呈现的,但是验证消息仍然使用最初使用的语言
  • 如果我调试处理语言开关的操作过滤器,我可以看到ModelState以原始语言保存错误,因此我猜测验证只在服务器中发生一次。 我想我需要清理ModelState并强制验证,但我想知道这是否是一种黑客行为,是否有更好的方法来处理这个问题

    谢谢! R.

    请阅读徐肖恩的帖子:

    ModelBinder(负责获取验证消息)在操作和actionfilters之前运行,这就是为什么区域性更改发生在验证消息文本确定之前,并且不受其影响

    您可以尝试将此代码移动到较早的扩展点,例如控制器的Execute或ControllerFactory的CreateController方法

    您可以在这里看到我的问题,以获得建议的解决方案:

    请阅读徐肖恩的帖子:

    ModelBinder(负责获取验证消息)在操作和actionfilters之前运行,这就是为什么区域性更改发生在验证消息文本确定之前,并且不受其影响

    您可以尝试将此代码移动到较早的扩展点,例如控制器的Execute或ControllerFactory的CreateController方法

    您可以在这里看到我的问题,以获得建议的解决方案: