12

ビューモデルを使用してレンダリングするビューのデータを含めるようにコントローラーを開発したいと仮定すると、すべてのデータをビューモデル内に含める必要がありますか? ViewModel をバイパスしても問題ない条件は何ですか?

私が尋ねる理由は、コードの一部が ViewData を使用しており、一部が ViewModel を使用している立場にあるからです。ViewData を使用するのが適切な場合と、ショートカットを使用する場合について、一連のガイドラインをチームに配布したいと考えています。私のガイドラインが私だけの偏見ではないことを理解するために、これに対処した他の開発者からの意見を求めています.

4

4 に答える 4

9

ファビアンのコメントをさらに進めるために。この記事で概説されている手順に従って、ビューデータが使用されないように明示的に確認できます。すべてにモデルを使用しない言い訳はありません。

ViewData を使用せざるを得ない場合 (たとえば、既存のプロジェクトで); 少なくとも文字列定数を使用して名前を解決し、「魔法の文字列」の使用を避けてください。次の行に沿ったもの:ViewData[ViewDataKeys.MyKey] = myvalue;実際、「文字列ベース」である必要があるほぼすべてのもの (セッション キー、キャッシュ キー、VaryByCustom 出力キャッシュ キーなど) にこれを使用します。

于 2010-08-06T11:23:47.790 に答える
4

ビューがより複雑になるにつれて考慮したいアプローチの 1 つは、モデルの使用を入力フィールドに予約し、ViewData を使用してビューがレンダリングする必要がある他のすべてをサポートすることです。

これを支持するには、少なくともいくつかの議論があります。

  1. 一部のデータが存在する必要があるマスターページがあります (たとえば、ヘッダー内の StackOverflow ユーザー情報のようなもの)。サイト全体に ActionFilter を適用すると、すべてのアクションの後で ViewData にこの情報を簡単に入力できます。モデルに配置するには、サイト内の他のすべてのモデルをベース モデルから継承する必要があります (これは最初は悪くないように思えるかもしれませんが、すぐに複雑になる可能性があります)。

  2. 投稿されたフォームを検証しているときに、検証エラーが発生した場合は、モデルを (無効なフィールドと共に) ビューに再バインドして検証メッセージを表示することをお勧めします。入力フィールドのデータはポストバックされ、モデルにバインドされるため、これは問題ありませんが、ビューに再入力する必要があるその他のデータについてはどうでしょうか? (例: ドロップダウン リストの値、情報メッセージなど) これらはポストバックされず、ポストバックされた入力値の「周辺」でこれらをモデルに再設定するのが面倒になる可能性があります。多くの場合、ViewData にビュー データを設定するメソッドを使用する方が簡単です。

私の経験では、このアプローチがうまく機能することがわかりました。

そして、MVC3 では、動的な ViewModelにより、文字列のインデックス作成が不要になります!

于 2010-08-10T03:54:57.377 に答える
2

私は個人的にViewDataを使用することはありません。何かをテストするときを除いて、すべてがモデルを通過し、ビューの値をすぐに確認できる必要があります。ストロングタイピング!

于 2010-08-06T11:12:25.803 に答える
1

ASP.NET MVC 2に関しては、ViewModelパターンが推奨されるアプローチです。このアプローチは、コンパイル時の静的型チェックを最大限に活用します。これをMVCビューのコンパイルと組み合わせると、実行時ではなくビルド/コンパイル時にエラーが検出されるため、開発ワークフローがはるかに高速で生産的になります。

于 2010-08-06T12:29:17.537 に答える