21

編集:ViewModelsを使用してビューからデータを入力および読み取るために、ValueInjecterと呼ばれるものを大幅に改善しました。http://valueinjecter.codeplex.com/

http://prodinner.codeplex.com(ASP.net MVCサンプルアプリケーション )で使用されます

あなたはprodinnerでViewModelsを使用する最良の方法を見ることができます

ViewModelを使用してマッピングロジックを格納することは、繰り返しとSRP違反があったため、あまり良い考えではありませんでしたが、ValueInjecterを使用すると、クリーンなViewModelとドライマッピングコードが得られます。


これは古いものです。使用しないでください
。asp.netmvcで編集するためのViewModelパターンを作成しました。このパターンは、エンティティを編集するためのフォームを作成する必要があり、フォームにドロップを配置する必要がある場合に便利です。ユーザーがいくつかの値を選択するためのダウン

    public class OrganisationBadViewModel
    {
        //paramterless constructor required, cuz we are gonna get an OrganisationViewModel object from the form in the post save method
        public OrganisationViewModel() : this(new Organisation()) {}
        public OrganisationViewModel(Organisation o)
        {
            Organisation = o;
            Country = new SelectList(LookupFacade.Country.GetAll(), "ID", "Description", CountryKey);  
        }       
        //that's the Type for whom i create the viewmodel
        public Organisation Organisation { get; set; }
...     

    }
4

4 に答える 4

11

これは、Wrox Professional ASP.NET MVCブックで推奨されている方法と非常によく似ています。この本の最初の章は、上記のURLから無料で入手できます。

100ページから、 ViewDataとViewModelsに関するセクションがあります。

ControllerクラスがHTML応答をクライアントにレンダリングすることを決定すると、応答をレンダリングするために必要なすべてのデータをビューテンプレートに明示的に渡す責任があります。ビューテンプレート、データの取得やアプリケーションロジックを実行しないでください。代わりに、コントローラーから渡されたモデル/データから駆動されるレンダリングコードのみを使用するように制限する必要があります。

[...]

["ViewModel"]パターンを使用する場合、特定のビューシナリオに最適化され、ビューテンプレートに必要な動的な値/コンテンツのプロパティを公開する強い型のクラスを作成します。次に、コントローラークラスにデータを入力し、これらのビュー最適化クラスをビューテンプレートに渡して使用できます。これにより、ビューテンプレート内での型の安全性、コンパイル時のチェック、およびエディターのインテリセンスが可能になります。

「Wroxが発行したRobConnery他が作成したProfessionalASP.NETMVC1.0の第1章「NerdDinner」」から引用。オリジナルはhttp://tinyurl.com/aspnetmvcで入手できます。

于 2009-09-09T13:14:16.563 に答える
9

気になることがいくつかあります。

  1. 用語。ViewModelは、この場合、データが入力され、後でコントローラーによって使用される単純なビューデータです。ASP.NET MVCインフラストラクチャがコントローラーと適切なアクションの選択を担当するため、Viewはコントローラーについて何も知りません。コントローラはユーザーの操作を処理します。ViewModelよりもパッシブビューのように見えると思います(ViewModelとはModel-View-ViewModelパターンを意味すると思います)。

  2. 詳細。ビューデータを設定するコントローラーは、ビューの実装方法の詳細を認識していないはずです。ただし、OrganisationViewModel.Countryは不要な詳細を開示しています(SelectListItemは純粋なビュー実装の詳細です)。したがって、コントローラーをビューの実装の詳細に依存させます。それを避けるために変更すべきだと思います。国のデータを保持するオブジェクトの使用を検討してください。

お役に立てれば。

于 2009-09-08T08:20:16.327 に答える
1

一般的には見栄えが良いと思います。通常、ドメインオブジェクトのビューモデルを作成することをお勧めします。

コードのすべての行を見たわけではありませんが、私の注意を引いたのは、OrganisationViewModelのコンストラクターでした。私はそれを使用して書き直します:

public OrganisationViewModel() : this(new Organisation()) { }

public OrganisationViewModel(Organisation o)
{
  Organisation = o;
  InitCollections();
}

InitCollections()これにより、両方のコンストラクターを呼び出す必要がないため、重複するコードが削除されます。もちろん、これはほんの小さな詳細であり、一般的な考え方とは何の関係もありません。

于 2009-09-01T07:54:50.723 に答える
1

これを開始しましたが、コントローラーが巨大になり始めました(ViewModelがデータベースに1:1でマップされているとは限らないため)。これを軽減するために、ViewModelを作成し、データベースにバインドされたデータにマップして戻すMapperクラスを作成しました。次に、コントローラーはMapperクラスのメソッドを呼び出すだけです。うまくいくようです。

于 2009-11-25T07:59:18.710 に答える