1. ホーム
  2. asp.net-mvc

[解決済み】ViewModelのベストプラクティス

2022-04-16 23:34:07

質問

から この質問 を作成するのは理にかなっているように見えます。 ViewModel しかし、私はいくつかの規則について興味があります (まだ明白でないとしても、私は MVC パターンの初心者です)。

基本的には、以下のような疑問がありました。

  1. 私は通常、1つのクラス/ファイルを持ちたいと思っています。 これは ViewModel もし、コントローラからビューにデータを渡すためだけに作成されるのであれば?
  2. もし ViewModel は独自のファイルに属し、ディレクトリやプロジェクト構造で分離している場合、そのファイル内の ビューモデル ファイルはどのようなものでしょうか? それは コントローラ ディレクトリを作成しますか?

基本的には今のところこれで終わりです。 私はいくつかのより多くの質問が来るかもしれませんが、これは最後の時間かそこらで私を悩ませている、私は他の場所で一貫した指導を見つけることができるようです。

EDITです。 サンプルを見てみると NerdDinnerアプリ にあるように、ViewModels は コントローラ しかし、独自のファイルでないことに違和感を覚えます。

解決方法は?

私は、各ビューのために"ViewModel"と呼ぶものを作成します。それらをMVC WebプロジェクトのViewModelsと呼ばれるフォルダに配置します。これらのモデルには、コントローラやアクション (またはビュー) の名前を付けています。例えば、Membership コントローラの SignUp ビューにデータを渡す必要がある場合、 MembershipSignUpViewModel.cs クラスを作成し、ViewModels フォルダに格納します。

そして、コントローラからビューへのデータ転送を容易にするために、必要なプロパティとメソッドを追加します。ViewModel から Domain Model へ、また必要に応じて Automapper を使ってデータを転送しています。

これは、他のViewModelsの型を持つプロパティを含む複合ViewModelsにも有効です。例えば、メンバーシップコントローラのインデックスページに 5 つのウィジェットがあり、それぞれの部分ビューに対して ViewModel を作成した場合、インデックスアクションから部分ビューにデータを渡すにはどうすればよいでしょうか。MembershipIndexViewModel に MyPartialViewModel タイプのプロパティを追加し、パーシャルをレンダリングする際に Model.MyPartialViewModel を渡します。

このようにすることで、Indexビューを全く変更することなく、部分的なViewModelのプロパティを調整することができます。また、Model.MyPartialViewModel を渡すだけなので、部分 ViewModel にプロパティを追加するだけなのに、何かを修正するために部分ビューのチェーン全体を通さなければならない可能性も少なくなります。

また、名前空間 "MyProject.Web.ViewModels" を web.config に追加して、各ビューで明示的に import 文を追加しなくても、どのビューでもそれらを参照できるようにする予定です。これで少しすっきりしました。