3

私はアプリケーションで 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);

誰かが私がどこで間違っているのか知っていますか?

4

1 に答える 1

12

私が見ていないのは、global.asax で DateTimeModelBinder を登録した場所です。

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

Scott Hanselman は、DateTime Custom Model Binders を操作する非常によく似た投稿をしています。

于 2014-03-15T22:50:23.147 に答える