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; } }
它使用精确解析,因此解析日期不会有任何问题。