C# 指令,而区域性设置操作不是简单的变量设置操作,但其成本不可忽略。最好编写一个全局控制器过滤器来处理区域性设置(我总是这样做),这样每个请求只执行一次操作

C# 指令,而区域性设置操作不是简单的变量设置操作,但其成本不可忽略。最好编写一个全局控制器过滤器来处理区域性设置(我总是这样做),这样每个请求只执行一次操作,c#,asp.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Microsoft建议将mvc4中的新jquery.validate.js替换为MVC3项目模板中的旧jquery.validate.js。这是可行的,但有趣的是,错误不在MVC4中,而是在MVC3中 我们使用Francesco描述的方法,查看接受的答案。如果这只发生在Chrome中,那么这是由于jquery版本在日期验证中存在区域性错误。通过ILSpy查看代码,似乎是新引入的ClientDataTypeModelValidatorProvider添加了数据val-date属性 如果您想恢复到M

Microsoft建议将mvc4中的新jquery.validate.js替换为MVC3项目模板中的旧jquery.validate.js。这是可行的,但有趣的是,错误不在MVC4中,而是在MVC3中


我们使用Francesco描述的方法,查看接受的答案。

如果这只发生在Chrome中,那么这是由于jquery版本在日期验证中存在区域性错误。

通过ILSpy查看代码,似乎是新引入的ClientDataTypeModelValidatorProvider添加了数据val-date属性

如果您想恢复到MVC3风格的功能,那么只需从模型验证提供程序列表中删除该提供程序即可

这并不能解决问题,但只需几行代码就可以消除jquery验证缺乏全球化所造成的问题

using System.Web.Mvc;

...

protected void Application_Start()
{
  var providers = ModelValidatorProviders.Providers;
  var clientDataTypeModelValidatorProvider = providers.OfType<ClientDataTypeModelValidatorProvider>().FirstOrDefault();
  if ( clientDataTypeModelValidatorProvider != null )
  {
    providers.Remove( clientDataTypeModelValidatorProvider );
  }

  ...
}
使用System.Web.Mvc;
...
受保护的无效应用程序\u Start()
{
var providers=modelvalidateproviders.providers;
var clientDataTypeModelValidatorProvider=providers.OfType().FirstOrDefault();
if(clientDataTypeModelValidatorProvider!=null)
{
移除(clientDataTypeModelValidatorProvider);
}
...
}

我自己的问题可能重复:谢谢,我看到了你的问题。我不用这个包裹。这是从MVC3到MVC4的1:1升级。我还试图从模板创建一个新的MVC4项目,但遇到了同样的问题。然后我删除了绑定,这也没有任何影响。您是否覆盖了问题中所示的默认jquery日期验证器?不,所有内容都是默认的。我可以在一个新的MVC4项目中复制这个bug。在system.web标记全球化中的web.config中为区域性和uiCulture设置区域性怎么样?谢谢,目前正在尝试。我希望在不修改太多代码的情况下找到解决方案。如前所述,它与MVC3一起工作没有问题。我知道,我真的很想知道到底是什么问题,这个客户端日期选择器验证/格式设置让我非常头疼,令人难以置信。这件事不应该是必要的。我可以把这个解决方案与定制的模型绑定器结合起来。我可以将所有文化的日期格式设置为Ansi日期格式,并使用datetime重载,这样我可以分别通过年、月和日。但让我们拭目以待,看看是否有更好的解决方案:DThanks,明天将尝试;-) data-lang="de" data-mindate="3" data-val="true" data-val-required="Bitte geben Sie das gew&#252;nschte Reisedatum des Hinflugs ein." id="DepartureDate" name="DepartureDate" tabindex="3" type="text" value="" public static void UpdateThreadCulture(CultureInfo culture) { Thread.CurrentThread.CurrentUICulture = culture; } ModelBinders.Binders.DefaultBinder = new CultureModelBinder(); ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeModelBinder()); // and many, many more public class DateTimeModelBinder : IModelBinder { private LogService _log = new LogService(); public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { object result = null; ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (valueResult != null) { try { var stateHandler = new StateHandler(controllerContext.HttpContext.Session); result = valueResult.ConvertTo(typeof(DateTime?), stateHandler.Culture); } catch { try { result = valueResult.ConvertTo(typeof(DateTime?), CultureInfo.InvariantCulture); } catch (Exception ex) { _log.Error("DateTimeModelBinder parse exception", ex); _log.KeyValue("AttemptedValue", valueResult.AttemptedValue); } } } return result; } } public class CultureModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { StateHandler stateHandler = new StateHandler(controllerContext.HttpContext.Session); Helper.UpdateThreadCulture(stateHandler.Culture); return base.BindModel(controllerContext, bindingContext); } } /Scripts/jquery-1.8.3.min.js /Scripts/globalize.js /Scripts/cultures/globalize.cultures.js // and much more other scripts... var currentLanguage = $("#DepartureDate").attr("data-lang"); alert(currentLanguage); $.preferCulture(currentLanguage);
// Replace dots so jq validator can understand what's going on
$(function () {
    $.validator.addMethod(
    "date",
    function (value, element) {
        var s = value;
        s = value.replace(/\./g, '/');

        // Chrome requires tolocaledatestring conversion, otherwise just use the slashed format
        var d = new Date();
        return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value))) || !/Invalid|NaN/.test(new Date(s));
    },
    ""
    );
});

$.validator.unobtrusive.parse();
using System.Web.Mvc;

...

protected void Application_Start()
{
  var providers = ModelValidatorProviders.Providers;
  var clientDataTypeModelValidatorProvider = providers.OfType<ClientDataTypeModelValidatorProvider>().FirstOrDefault();
  if ( clientDataTypeModelValidatorProvider != null )
  {
    providers.Remove( clientDataTypeModelValidatorProvider );
  }

  ...
}