-1

日付ピッカーを生成するために 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 属性。

4

1 に答える 1

0

したがって、テンプレートの TextBox は、ModelStateDictionary に存在する「StartDate」キーを持つ KeyValuePair から値を取得していました。このディクショナリは、JavaScript がコントローラを呼び出してバインドが発生したときに入力されました (「投稿されたフォームをアクション メソッドにバインドしようとする試みの状態を表します」- MDSN)。Model.StartDate の値をテンプレートに渡していたとしても、TextBox は ModelStateDictionary の一致するキーを優先します!

したがって、私の回避策は、モデルの開始日に StartDateVm という名前を付けることでした。Gary Clarkeの投稿で見つけたように、ヘルパーのこの動作は役立つため、ModelState に既に存在するビュー モデルに同じ値を割り当てるコードを繰り返さないようにしています。ゲイリーの投稿をお勧めします。

于 2014-07-06T07:17:23.430 に答える