MVC日期时间模型绑定

我在我的应用程序中使用2个kendo日期选择器:

Start Date:
@(Html.Kendo().DatePickerFor(m=>m.StartDate))
End Date:
@(Html.Kendo().DatePickerFor(m=>m.EndDate))

单击该按钮时,我会读取这些日期选择器客户端的值,并对API控制器进行POST。

我遇到的问题有时是DateTime参数被错误地解析,我使用的是en-GB文化(在我的web.config中指定),但是给定日期为2014年3月1日(3月1日),当值为由模型绑定器处理,它被解释为03/01/2014(1月3日)。

我的javascript如下:

 function getGraphData() { var startDatePicker = $("#StartDate").data("kendoDatePicker"); var endDatePicker = $("#EndDate").data("kendoDatePicker"); var param = { StartDate: kendo.toString(startDatePicker.value().toLocaleDateString(), "dd/MM/yyyy"), EndDate: kendo.toString(endDatePicker.value().toLocaleDateString(), "dd/MM/yyyy") }; // Do post here } 

我的模型如下:

 public class DateRangeParam { #region Constructors and Destructors ///  /// Initializes a new instance of the  class. ///  public DateRangeParam() { this.EndDate = DateTime.Today.AddDays(1).AddSeconds(-1); this.StartDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); } #endregion #region Public Properties ///  /// Gets or sets the end date. ///  public DateTime EndDate { get; set; } ///  /// Gets or sets the start date. ///  public DateTime StartDate { get; set; } #endregion } 

我认为解决方案是我需要一个自定义模型绑定器来解析日期时间值,所以我创建了(如下所示)并将其注册在Global.asax.cs文件中,但这没有用,绑定从不调用,我我不确定这是因为datetime是自定义对象的属性。

  public class DateTimeModelBinder : IModelBinder { #region Fields private readonly string _customFormat; #endregion #region Constructors and Destructors public DateTimeModelBinder(string customFormat) { this._customFormat = customFormat; } #endregion #region Explicit Interface Methods object IModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); return DateTime.ParseExact(value.AttemptedValue, this._customFormat, CultureInfo.InvariantCulture); } #endregion } 

它注册如下:

 var binder = new DateTimeModelBinder(new CultureInfo("en-GB").DateTimeFormat.ShortDatePattern); ModelBinders.Binders.Add(typeof(DateTime), binder); ModelBinders.Binders.Add(typeof(DateTime?), binder); 

有谁知道我哪里出错了?

我没看到的是你在global.asax中注册DateTimeModelBinder的地方:

 ModelBinders.Binders[typeof(DateTime)] = new DateAndTimeModelBinder() { CustomFormat = "yyyy-mm-dd" }; 

Scott Hanselman使用DateTime Custom Model Binders这个非常相似的post