ASP.NET MVC3:强制控制器使用日期格式dd / mm / yyyy

基本上,我的datepicker使用英国格式的dd/mm/yyyy 。 但是当我提交表单时,ASP.net显然使用美国格式。 (只接受少于12天,即认为是月份。)

  public ActionResult TimeTable(DateTime ViewDate) 

有没有办法强迫它识别某种方式?

奇怪的是,其他插入方法似乎认识到正确的格式。

“参数字典包含参数ViewDate的null条目,该参数为非可空类型System.DateTime用于ViewDate中方法System.Web.Mvc.ActionResult Index(System.DateTime) 。可选参数必须是引用类型,可以为空的类型,或者声明为可选参数。“

读一读。 它很好地解释了发生了什么以及它为什么会起作用。

我知道每个使用该网站的人都在英国,所以我可以安全地覆盖默认的DateTime模型绑定器:

 public class DateTimeModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var date = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue; if (String.IsNullOrEmpty(date)) return null; bindingContext.ModelState.SetModelValue(bindingContext.ModelName, bindingContext.ValueProvider.GetValue(bindingContext.ModelName)); try { return DateTime.Parse(date); } catch (Exception) { bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid.", bindingContext.ModelName)); return null; } } } 

您需要为DateTime使用自定义ModelBinder。 我和你有同样的问题。

您是否尝试将当前文化设置为en-GB?

 protected override void Initialize(System.Web.Routing.RequestContext requestContext) { base.Initialize(requestContext); CultureInfo cultureInfo = CultureInfo.GetCultureInfo("en-GB"); Thread.CurrentThread.CurrentCulture = cultureInfo; Thread.CurrentThread.CurrentUICulture = cultureInfo; } 

你能行的:

  • 全局(在Application_Start()下的global.asax中):

     ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder()); 
  • 方法:

      public ActionResult TimeTable([Binder(typeof(DateTimeModelBinder)]DateTime ViewDate) 
  • 对于自定义模型类 – 啊不,没有可能性导致您使用struct DateTime 😉

啊,抱歉,我无法在Adamspost中添加评论 – 这是基于他的代码。

基本上,我的datepicker使用英国格式的dd / mm / yyyy

初学者的错误。 它应该使用浏览器设置的任何格式。 问题不是格式,而是客户端和服务器之间的格式不同。 服务器应该根据协商的区域设置发出格式化日期的代码,然后服务器也会使用它来解析它。

但是当我提交表单时,ASP.NET显然使用美国格式。

不。 这就是说,当我服用香料时,它总是盐,然后你总是加盐。 您的服务器接受当前协商的文化 – 除非您修改设置 – 在客户端和服务器之间协商。 检查线程当前文化何时应该进行解析以查看它的设置。

从我的BindigTools绑定DateTime? (Nullable),基于一些书籍样本 – Pro MVC3

  public static DateTime? GetValueNDateTime(ModelBindingContext context, string searchPrefix, string key, string format) { ValueProviderResult vpr = context.ValueProvider.GetValue(searchPrefix + key); DateTime outVal; if (DateTime.TryParseExact(vpr.AttemptedValue, format, null, System.Globalization.DateTimeStyles.None, out outVal)) { return outVal; } else { return null; } } 

它使用精确解析,因此解析日期不会有任何问题。