C# 指令,而区域性设置操作不是简单的变量设置操作,但其成本不可忽略。最好编写一个全局控制器过滤器来处理区域性设置(我总是这样做),这样每个请求只执行一次操作
Microsoft建议将mvc4中的新jquery.validate.js替换为MVC3项目模板中的旧jquery.validate.js。这是可行的,但有趣的是,错误不在MVC4中,而是在MVC3中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
我们使用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ü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 );
}
...
}