私はアプリケーションで 2 つの剣道日付ピッカーを使用しています。
<div class="span12">
<div class="span2" style="text-align: right">
Start Date:
</div>
<div class="span2">
@(Html.Kendo().DatePickerFor(m=>m.StartDate))
</div>
<div class="span2" style="text-align: right">
End Date:
</div>
<div class="span2">
@(Html.Kendo().DatePickerFor(m=>m.EndDate))
</div>
<div class="span4">
<button class="btn btn-primary" onclick="getGraphData()">Show</button>
</div>
</div>
ボタンがクリックされると、これらの日付ピッカーのクライアント側の値を読み取り、API コントローラーに POST を送信します。
私が抱えている問題は、DateTime パラメーターが正しく解析されないことがあります。en-GB カルチャ (web.config で指定) を使用していますが、日付が 2014 年 1 月 3 日 (3 月 1 日) の場合、値がモデル バインダーによって処理されると、2014 年 3 月 1 日 (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
/// <summary>
/// Initializes a new instance of the <see cref="DateRangeParam"/> class.
/// </summary>
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
/// <summary>
/// Gets or sets the end date.
/// </summary>
public DateTime EndDate { get; set; }
/// <summary>
/// Gets or sets the start date.
/// </summary>
public DateTime StartDate { get; set; }
#endregion
}
解決策は、datetime 値を解析するためのカスタム モデル バインダーが必要であると考えたので、(次のように) 作成して Global.asax.cs ファイルに登録しましたが、これは機能しませんでした。バインダーが呼び出されることはありません。日時がカスタム オブジェクトのプロパティであるためかどうかはわかりません。
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);
誰かが私がどこで間違っているのか知っていますか?