2012-02-17 11 views
13

Viewに必要なすべてのオブジェクトのラッパーに似ていると思いますか?MVCでは、ViewModelとは何ですか?

たとえば、音楽とDVDを販売していたオンラインストアがあるとします。ブラウズページでは、あなたのすべてのDVDと音楽のリストを表示したいでしょう。したがって、アルバムリストとDVDリストを含む2つのプロパティを持つViewModelオブジェクトを作成しますか?

私の理解から、あなたはすべてのモデルクラスを持っているようです。 Album/Dvdクラスではなく、単にこれらを渡すだけでは、あなたのViewでは十分ではありません。 ViewModelは基本的にViewが必要とするすべてのデータのキャリアとして機能しますか?

+3

[MVCのViewModelとは何ですか?](http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc) – HaveNoDisplayName

+0

@HaveNoDisplayName残念ながら、この質問は4ヶ月古いあなたが複製されているとマークしたもの、もう1つはこれよりはるかに多く見られます。タイトルは私が見るすべての違いを作ります。 –

+0

もう一つの質問にはより良い答えがあるので、これは重複して閉じられるべきであり、逆ではありません。 – Liam

答えて

13

ご理解の方が大丈夫ですが、完全ではありません。

ViewModelは、モデルが保持するデータのタイプから、ビューが便利に操作できるデータのタイプに変換することもできます。これは、ViewModelがモデルを直接運ぶのではなく、より適切なフォーマットで同じ情報を(おそらくはそのサブセットで)運ぶ他の船舶を運ぶことを意味するかもしれません。

アルバムとDVDを集約するライブラリモデルがあると考えてください。このモデルと対応するViewModelの違いは、モデルがViewModelにViewを気にしていないそれを促進する明確な目的。

+1

この回答は部分的に正確であり、あまり明示的ではありません(「... ViewModelはそれを促進する明確な目的を持っています」には何も説明されていません)。 Deepakmahajanの答えは、それほど深くはないが、より正確です。私はここで詳細を与える関連する質問に答えた:http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc/29135747#29135747 – Sam

+0

今後の読者は、サムによって与えられたリンクに従って見てください答えで。それは確かに非常に有用です。 –

14

ViewModelsを使用すると、1つ以上のデータモデルまたはソースの複数のエンティティを、ビューで消費およびレンダリング用に最適化された1つのオブジェクトに整形できます。

ViewModelの目的は、ビューに1つのオブジェクトをレンダリングさせることで、必要に応じてビュー内にUIロジックコードが不要になります。つまり、ビューの唯一の責任または懸案事項は、単一のViewModelオブジェクトをレンダリングして、より明確な分離(SoC)の分離を支援することです。懸念事項は、特定の目的(すなわち懸念事項)を持つアプリケーションの明確な側面であり、これらの側面を分けておくことは、アプリケーションがより組織化され、コードがより重視されることを意味します。データ操作コードをビューとコントローラから離れた場所に置くと、SoCが強制されます。

関連する問題