日付ピッカーを生成するために EditorTemplate を作成しようとすると、非常に奇妙なことが起こります。テンプレートに渡される値は文字列ですが、Unix タイムスタンプに変換されています。この文字列は、viewModel の文字列としてビューに送信される前に、コントローラーの Unix タイムスタンプから実際に変換されているため、両方のコードが何らかの方法でリンクされているかどうかはわかりません (??)。エディター テンプレートを次のように最小化しました。
1 @model String
2
3 @Model.ToString()
4 @Html.TextBox("", Model.ToString())
3 行目は正しい値「3/7/14」を出力しますが、4 行目は値が「1404309600」のテキスト ボックスを作成します。
これは本当に紛らわしいです。何か助けはありますか?ありがとうございました。
新しい情報で編集
さらにテストを行った後、問題の内容とその原因をもう少し説明できます。私はFullCalendarを使用しています。日付の範囲を選択すると、新しいイベントを作成するためのフォームが新しいモーダル ウィンドウで開かれます。Ajaxパスリクエストは次のようなものです
Create?startDate=1404309600&endDate=1404396000
次に、コントローラーがイベントのデータを入力します。フォームには、渡された開始日と終了日が文字列として含まれます。すべてのデータは、ViewModel のビューに渡されます。
ビューは、次のコード行を使用して EditorTemplate を呼び出し、datepicker 入力を生成します。
@Html.EditorFor(model => model.StartDateVm, new { Value = Model.StartDateVm.ToString() })
そして、パラメーターを[UIHint("DatePicker")]で装飾しました
元の問題に戻ります。この行は、ViewModel の文字列ではなく、コントローラーに渡された Unix タイムスパンの値を使用して入力を生成します。
いくつかの調査の後、fullcalendar のパラメーターは「startDate」と呼ばれ、ViewModel のパラメーターは「StartDate」であることがわかりました。ViewModel 属性名を StartDateVm に変更し、そのすべての参照をこの名前に変更したところ、入力に正しい文字列が表示されるようになりました。したがって、TextBox ヘルパーが ViewModel からではなくブラウザから値を取得していると思います。
私の質問は、なぜこれが起こっているのかです。これで回避策はわかりましたが、問題がどこにあるのかを理解したいと思います。MSDNで与えられたこの説明と関係があると思いますが、完全には理解できません: 値はこの順序で取得されます - ModelStateDictionary オブジェクト、このパラメーターの値、ViewDataDictionary オブジェクト、そして最後に値属性html 属性。