ASP.NET MVCモデルとViewModel


92

はい、MSのASP.NET MVCに関する「ViewModels」についての議論を聞いています。

さて、それは特定の種類のモデルを意図したものですよね?特定の種類のビューではありません。

私の理解では、それはビューと対話する特定の目的を持つ一種のモデルですか?それともそのようなものですか?

いくつかの説明をいただければ幸いです。

回答:


71

基本的に、ModelとView Modelはどちらも属性を持つ単純なクラスです。

これらのクラスの主な目的は、コントローラーとビューであるそれぞれのオーディエンスのオブジェクトを(「モデル化する」ために)記述することです。

だからあなたが言うときあなたは完全に正しいです

私の理解では、それはビューと相互作用する特定の目的を持つ一種のモデルです

したがって、モデルクラスはアプリケーションが対話する実質的なドメインエンティティですが、ビューモデルはビューが対話する単純なクラスです。

それが役に立てば幸い :)

更新

マイクロソフトは、主にモデルビューコントローラーに基づいたマーティンファウラーによるプレゼンテーションパターンの特殊なバージョンを開発し、PFアプリケーション用のモデルビュービューモデル(MVVM)と呼びました。このパターンは、UI開発者が従来の開発者よりもビジネスロジックに基づいて異なる要件を持つ現代のUI開発プラットフォームを対象としています。見ているこちら理論のビットのために


1
OK、ありがとう、そしてアップデートにも感謝します、それは非常に役に立ちます!では、MSの特別バージョンを考慮せずに、ストックMVC 2を使用して、ViewModelを特別な指定フォルダーに配置しますか?それとも、他のフォルダと同じように、基本的にModelsフォルダに配置されていますか?または、あなたはどちらかを行うことができますか?
Qcom、

どういたしまして。モデルとビューモデルを同じフォルダーに配置するのは、それらが参照するドメインを基準にして一緒にグループ化したいためです。それは私の選択であり、より良いものがあると確信しています
Lorenzo

5
ViewModelは、(ドメイン)モデルからビューを分離することになっています。そのため、ViewModelをModelの近くではなく、Viewの近くに置くことは理にかなっています。
Vitaliy Ulantikov、2011

私は 'Model'クラスをModelフォルダーではなくMVCプロジェクトの外に置きます-ただし、View ModelクラスはMVCプロジェクト内に置きます。これにより、Vitaliyが言うように、それらはビューの近くになります。
Dan Harris

@Lorenzo最初の行では、「属性を持つ単純なクラスの両方」と言います。プロパティとはどういう意味ですか?そうでない場合、どの属性を参照していましたか?属性プロパティ
xr280xr 2015

69

簡単に言えば、次のことを考えたいと思います。

モデル:厳密にデータモデルのように見えます。すべての意図と目的において、これはデータモデルのクラス表現にすぎません。ビューやビュー内の要素についての知識はありません。とはいえ、ビューに使用する属性デコレータ(つまり、必須、長さなど)を含めることはできません。

ビューモデル:ビューとモデル間のデータバインダーとして機能し、多くの場合、モデルのラッパーでもあります。ビューがなければ役に立たなくなるため、通常、標準のモデルのように複数のビューやコントローラで再利用することはできません。

例として、モデルには次のプロパティがあります。これらのプロパティは、データソースを直接表現したものです。

    public string FirstName { get; set; }
    public string LastName { get; set; }

これで、ビューモデルはビューに関連付けられているため、次のプロパティを持つことができます。これは、モデルのFirstNameフィールドとLastNameフィールドを1つの文字列として連結します。

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}

2
ViewModelの完全な例を提供できますか?myModelがどのように認識され、myModelのデータがどのように取得されますか?
MケニオンII

5
本来、ViewModelは昔ながらのC#オブジェクト(POCO)であり、データモデルがどのように見えるかを本当に知ることはありません。これは、ビューを表示するために必要なデータモデルと特定の要素のハイブリッドです。データを取得する方法に関しては、データをロードする必要があります。別の中間クラスを使用したいのですが、データのサービスを呼び出してから、そのデータを手動でViewModelにロードします。次に、完全にロードされたViewModelをコントローラーアクションに返します。
Jason Marsell、2015

26

この記事は、MVCアプリケーション内で「ドメインモデル」と「ビューモデル」がどのように相互作用するか、特にバインディングに関して理解するのに非常に役立つリソースであることがわかりました。何よりも、抽象的な説明ではなく例が含まれています。

「MVCがリリースされてから、ビューモデルを作成する最善の方法について多くの混乱が見られました。ベストプラクティスの推奨事項に関する情報が大量にないように思われる場合があるため、この混乱は正当な理由がないわけではありません。さらに、銀の弾丸として機能する「1つのサイズですべてに適合する」ソリューションです。この投稿では、浮上した主なパターンのいくつかと、それぞれの長所と短所について説明します。これらのパターンの多くは、現実の問題を解決する人々から生まれました。」

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx


19

WikiPediaには、SOの回答で得られるよりもModelViewとModelViewの完全な説明があります。http//en.wikipedia.org/wiki/Model_View_ViewModel

私は引用します:

モデル:従来のMVCパターンと同様に、モデルは(a)実際の状態のコンテンツを表すオブジェクトモデル(オブジェクト指向アプローチ)、または(b)そのコンテンツを表すデータアクセスレイヤー(データ中心的なアプローチ)。

ビュー:クラシックMVCパターンと同様に、ビューは、ボタン、ウィンドウ、グラフィックス、その他のコントロールなど、GUIによって表示されるすべての要素を指します。

ViewModel:ViewModelは「ビューのモデル」です。つまり、ビューとモデル間のデータバインディングにも使用されるビューの抽象化です。これは、モデル情報をビュー情報に変更し、ビューからモデルにコマンドを渡すデータバインダー/コンバーターとして機能するコントローラー(MVCパターン内)の特殊な側面と見なすことができます。ViewModelは、パブリックプロパティ、コマンド、および抽象化を公開します。ViewModelは、モデル内のデータの実際の状態ではなく、データの概念的な状態に例えられています。


3
ModelとViewModelの説明がありますが、そのリンクはMVVMアーキテクチャパターンを説明しているだけです。モデルとビューモデルの違いではありません
Lorenzo

5

ViewModelの概念がありますが、一般的にはAsp.net MVCに関連付けられていません。MVCは、モデルビューコントローラーパターンを使用します。コントローラーパターンは、相互作用を処理し、モデルからデータを構築し、そのデータをビューに渡して表示します。

ViewModels(およびモデルビューのViewModelパターン)は、より一般的にはSilverlightおよびWPFに関連付けられています。Xamlは、ビューがViewModelへの双方向バインディングを実行できるという点で少し異なります。したがって、テクノロジーは少し異なります。たとえば、テキストボックスをフィールドにバインドした場合、そのテキストボックスに入力すると、フィールドの値が動的に更新されます。Webページはステートレスであるため、このような相互作用はWebページでは実際には不可能です。

2つのパターンの類似点は、どちらもロジックを表示から分離しようとしていることです。これの最も一般的な使用/理由はテストです。ユーザーがユーザーインターフェイスを介して呼び出すすべての対話を(テストフレームワークを介して)コードから実行できるようにしたいと考えています。


私が読んでいる本「Professional ASP MVC 2」では、強く型付けされたものとDRYの両方のプレゼンテーション/モデルの相互作用を維持する手段として、ViewModelが第1章で紹介されています。マイクロソフトの作者には、Scott Hansleman、Phil Haack、Scott Guthrieが含まれます。
Berryl、

私は最近、ViewModelがAsp.net MVCで使用されていることをさらに詳しく見てきました。ViewModelは、ドメインモデルよりもビューに多くのビジネスを持っているように見えます。したがって、私たちが使用しているパターンは、ドメインモデルにViewModelの主要部分を組み立てさせることです。現在、ドメインモデルと連携してタスクを実行する変更されたコマンドパターン(操作)を使用しています。結果はViewModelにアセンブルされ、ビューに送信されます。この場合のビューモデルは、すべての注釈と、ビューをサポートする単純で焦点の合ったロジックを保持します。
Sinaesthetic 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.