2012-02-24 4 views
1

.netとMVCについて少し読んだことがあります。私はMVCでViewModelsを使うことを示唆したことを覚えています。これは、コントローラによって制御されるべきデータをビューに混乱させる欲求を軽減するのに役立つだろう。混乱した.net MVCモデルとモデルの表示

これはMVVMパターンによって参照されるものだと思いました。明らかにそれを見た後、実際には実装はコントローラを完全に廃止します。正確には私がしたいことではありません。

私の場合、ViewModelを使用するのはまだ合法ですか?それはより良い練習か不必要な仕事か? ViewModelsディレクトリ/名前空間はどこに置くでしょうか?モデルディレクトリの下に?

モデルがViewModelsについて知っているのは正当でしょうか?たとえば、コントローラにViewModelを返すモデルがありますか?

+0

私はjqgridを使用asp.net MVCプロジェクトにしています。 jqgridには、特定の要求および応答データ構造が必要です。そこで、jqgridを操作するための特定のビューモデルを作成しました。シンプルな値型、ディクショナリ型、IEnumerable型などの単純な入力データ(コントローラアクションへの)の場合、asp.net mvcは通常、それらのデータに "バインド"する方法を理解することができます。 –

+0

これへの参照を追加したいと思っていますが、特定の回答の下で資格があるかどうかはわかりませんので、ここで取り上げます:http://freshbrewedcode.com/joshbush/2012/03/05/mass-assignment-aspnet-mvc/ – Chris

答えて

1

モデルとViewModelが異なります。 ViewModelとMVVMパターンを混同しないでください。

ビューモデルを使用すると、モデルとビューのやり取りがより簡単になります。モデルはメンバとして他のモデルオブジェクトをメンバとして持つ複雑な場合があります。

ビューモデルを使用すると、ビューの扱いを簡単にすることができます。これはインテリセンスで見ることができるものもフィルタリングします。したがって、ビューを扱っている人とは異なるモデルを開発している人がいれば、単純なビューモデルを作成するだけで、UIを扱う人にとってはずっと簡単になります。

+0

ViewModels名前空間をモデル名前空間に配置しますか?これは別の場所にあるはずのものですか? –

+0

問題はありません。それはあなた次第です。私のプロジェクトでは、通常ViewModelフォルダを作成します。 – goenning

+4

@ Walt - ほとんどの重要でないプロジェクトでは、ビジネスレイヤーとデータレイヤーを別々のプロジェクトに配置します。これはMVCのモデルフォルダを厳密にビューモデルにします。あなたがそれをしていない場合は、ViewModelsフォルダを簡単に作成して分離を作成することもできます。 –

1

私の意見では、デザインパターンは厳密な概念ではなく、アプリケーションをよりよく設計するのに役立つガイドラインです。 Model-View-ViewModel(MVVM)のデザインパターンは、パターンを容易にする非常に堅牢なBata BindingフレームワークがあるWPFに由来します。モデルにビジネスデータが含まれていることが考えられますが、モデルに属していない特定のデータ(ツリーコントロールで現在選択されているアイテム)を表示することが多いため、モデルをラップするビューモデルオブジェクトを作成し、ビューモデルにはビュー固有の状態データも含まれていました。したがって、ビューはモデルオブジェクトの代わりにビューモデルに直接バインドすることができるため、モデルをクリーンに保つことができます(テストや管理など)。

Asp.net MVCは、ViewsのデータバインディングがWPFほど強力でない点が異なります。 WPFでは、実際に多くのGUIを実装し、データバインドをモデル化してデータのやりとりを行うことができ、ビューモデルが有用になりました。しかし、Asp.net MVCでは、コントローラはこれを処理するように設計されており、データバインディングは存在しないものに近いため、Asp.net MVCのモデルオブジェクトの周りにモデルラッパーを表示する価値はありません。

+1

あなたは値を見ることはできませんが、そこにあります。 1つは、データアノテーションを使用して検証でASP.NET MVCのビルドを使用する場合、ドメインオブジェクトを汚染するのではなく、検証属性で装飾された別個のビューモデルを持つ方がはるかにクリーンです。また、ビューモデルを特定のビュー要件に合わせて調整することもできます。これは、ビューのDTOのよ​​うなものです。 – Chris

+0

@Chris - エンティティレベルのセキュリティ実装がドメインモデルではなくビューモデルレイヤに属していると思いますか?現在、各エンティティにセキュリティIDフィールドを追加することを検討していますが、ドメインを「汚染」しているようです(別のセキュリティプロバイダやフレームワークを使用すると、ドメインエンティティのすべての秘密フィールドを変更する必要があるためです)。 –

+0

@Chris - .NETでViewModel/Modelをコントローラ内のアクションメソッドのパラメータにすることができるため、ViewModel/Modelに関する質問が不思議でした.Netはフォームの投稿や定期的なリクエストから値を自動的に取り込みますViewModelを使用する場合は、ViewModelからモデルにデータを取得するたびに別の手順を踏む必要があります。フリップサイドでは、アクションメソッドで複数のモデルによって表されるデータが必要になることがあるため、ViewModelはその状況。 –

2

ViewModelsはMVCプロジェクトではデフォルトではありません。それはあなたがそれをモデル「より簡単に」

http://rachelappel.com/use-viewmodels-to-manage-data-amp-organize-code-in-asp.net-mvc-applications

にカップルの表示にあなたに利益をもたらすと感じた場合のViewModelの概念は、あなたとわかるように、ちょうどASP.NET MVCのためではありませんあなたが追加する必要があるものですMVC、MVP、およびMVVMのパターンに関する記事やブログの記事で、Web全体のViewModelsへの参照を参照してください。これらの投稿と記事は、ASP.NET、Silverlight、WPF、MVCなどの任意の数の技術を中心にすることができます。この投稿は、ASP.NET MVCの世界に適用されるViewModelsを調査します。

http://msdn.microsoft.com/en-us/magazine/ff798279.aspx

+0

モデルはコントローラにView Modelを返すことができますか?何らかの理由で、私はデータを見るのが忘れておくべきであり、コントローラがModelデータをViewModelに送信してからビューに渡すべきであると考えていました。 –

+0

私はそれらを別々にしておきます。 –

関連する問題