2011-07-11 4 views
2

ASPNET MVCを学習しようとしています。初心者のご迷惑をおかけして申し訳ありません.DbModelをDB構造から構築していますので、Modelsの下に.edmxファイルがありますデータにアクセスする。ASPNET MVC3でViewModelを使用する方法

ViewModelsクラスをビューとモデルの間で動作させることは良いことがあると読んだことがありますが(これは単一フィールドの書式設定にも有効です)、これが正しいかどうか、それらを構築する:彼らは私のモデルでクラスを再現する場合、私はそれが少し冗長であると信じていますか? これが正しい場合、自動的にViewModelクラスを生成する方法はありますか?

答えて

3

MVCのViewModelは、ビューのモデルです。通常はプリミティブ型のプロパティバッグです。重複しているように見えるかもしれませんが、コードをデカップリングすることで将来の問題から身を守ります。一例として、

は、ドメインモデルでPersonオブジェクトを与えられた:

public class Person 
{ 
    public string FirstName {get; set;}  // John 
    public string LastName {get; set;}  // Doe 
    public DateTime Birthdate {get; set;} // 01/01/1965 
} 

あなたのビューでは、フルネーム、年齢や誕生日などのビューでこれを表現したいことがあります。 ViewModelは次のようになります。

public class PersonViewModel 
{ 
    public string FullName {get; set;}  // John Doe 
    public int Age {get; set;}    // 46 
    public int Birthday {get; set;}  // January 1 
} 

ドメインモデルからビューモデルに変換する必要があります。私は、永続化レイヤーからの投影クエリ、またはAutoMapperのようなオブジェクトからオブジェクトへのマッピングフレームワークのいずれかを使用しました。

このようにデータを構造化することで、ロジックとフォーマットルールをビューマークアップから守ることができます。 AutoMapperなどのフレームワークを使用することで、日付と時刻の文字列書式を標準化し、コンベンションベースのマッピングを行うこともできます。

また、私は一般的にViewごとに1つのViewModelを持つことをお勧めします。 View/ViewModel構造体を共有したり、条件付きビュー情報を適用する必要がある場合は、それらを部分ビューに分割する必要があります。

+0

フォームポストシナリオの処理方法を提案するのに十分親切ですか?私はviewmodelからビジネスモデルに変換するのに苦労しています。Automapper、読んだことは本当に意味がありませんこのシナリオを処理し、これを処理する唯一の論理的な方法は、モデルを構築するためにviewmodelインスタンスを受け取るビジネスモデル内のコンストラクタを提供するか、またはコントローラにコードを書き込むために残しておくことです。何を指示してるんですか? – ignaciofuentes

+0

あなたのコントローラには、あなたのフォーム要素に一致するプロパティを持つパラメータオブジェクトを取る '[HttpPost]'に起因する 'ActionResult'を提供してください。 MVCモデルバインダーは、これらのプロパティーをフォーム要素値で塗りつぶします。そのオブジェクトを持って、それをあなたのサービスに渡す。 (私はこれらのフォームビューモデル、または短いモデルを呼び出しましたが、それはドメインモデルを更新する必要があるだけのDTOです) – codeprogression

+0

サービスでは、正しいプロパティをビジネスモデルへのビューモデル、右?このようなものです。 – ignaciofuentes

1

「ビューモデル」(ドメインモデルではなくビューのモデル)は、ドメインモデルをページにバインドされているものから分離するのに役立ちます。それはいつも必要ですか?いいえ、複数のビューに共通のデータシェイプを使用し、ビューにもいくつかの追加データがある場合は便利です。もう1つの良い用途は、特定のタイプのビューから特定のデータを削除することです(顧客はマージンを知るべきではありませんが、管理は必要です)。 ITは必須ではありません。

2

あなたが始めているのであれば、私はあなたの初期のアプリケーションに見つけることができるすべてのベストプラクティスを組み込むことを避けるでしょう。誰もがベストプラクティスであり、基本を学ぶだけのことを忘れてしまったことをすべて試してみるのはとても簡単です。

表示モデルは、明らかにプレゼンテーションレイヤーとドメインレイヤーを分離する優れた方法ですが、他の目的にも役立ちます。あなたがちょうど始まっていて、あなたのアプリケーションがひどく複雑ではない場合は、単純なままにして、あなたのビューがシンプルなビューモデルとしてドメインクラスを使用することをお勧めします。これにより、アプリケーションにもっと集中することができます。

また、これを実行すると、単純なドメインモデルではカットされないビューが表示され、ViewModelが必要になることがわかります。ビューページに必要なより具体的な情報(複数のドメインオブジェクトなど)を組み込むことができます。

すべてのビューモデルを使用せずに練習することで、そのメリットを理解し、自分と自分のコードに最適なものを決めることができます。

関連する問題