2009-04-20 10 views
3

強く型付けされたビューを必要とするASP.NET MVCのブログエンジンを想像してみてください。私はBlogPost用のモデルとコメント用のモデルを持っています。典型的なページは、ブログ投稿とその投稿のすべてのコメントを表示します。どのオブジェクトをView()に渡す必要がありますか?プレゼンテーションモデルを作成する必要がありますか?たぶん私は間違ってその用語を使用しているかもしれませんが、それは私がBlogAndCommentsのようなView()のためだけに複合モデルを作成すべきであることを意味しますか?私のコントローラーはBlogAndCommentsのインスタンスを作成してそれを保存する必要がありますか?ASP.NET MVCでプレゼンテーションモデルを使用する場合

または、どういうわけかBlogPostとコメントオブジェクトの両方をビューに渡す必要がありますか?

答えて

4

プレゼンテーションモデルを理解していればうれしいですね。ビューモデルを作成する時期については、おそらく「それは依存している」と答えています。あなたの例では、おそらくBlogPostとコメントをViewDataオブジェクトに渡すことで逃れることができます。それは豪華ではありませんが、ちょっと、それは仕事を完了します。

それが醜いか扱いにくいと感じるようになったら、私はView Modelの作成を考え始めます。私は通常、ページタイトル、共通データ、特定のページの特定のものを含む何らかの種類の「ページ」の概念に結びついています。あなたの場合、それはタイトル、BlogPostとリストコメントを含むBlogViewPageとして終わるかもしれません。

このアプローチの素晴らしい点は、要求を行い、BlogViewPageが期待されるデータを含んでいることをテストすることによってコントローラをテストできることです。

+1

この場合、「プレゼンテーションモデル」という用語も使用されます。 WPF固有のものではありません。 –

+1

実際、私はそれが間違っていると思う。 Model-View-ViewModelは私が考えていたパターンです。 http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspxを参照してください。コレクションはIObservableなどで表示されます。これは、あなたの提案を反映するために投稿を更新します。 – Travis

1

私の意見では、投稿自体の見解だけではなく、

のようなあなたのコメントのBLクラスを作成します。そして、あなたはあなたのポストのためにBOを持って

class CommentBO 
{ 
    Guid UserID; 
    string Text; 
} 

class PostBO 
{ 
    Guid UserID; 
    List<CommentBO> Comments; 
} 

あなたのモデルは本当に簡単です。

class BlogModel 
{ 
    string AuthorName; 
    string BlogTitle; 

    List<PostBO> Posts; 
} 

ビューに渡してレンダリングします。

すべてのBOを省略し、モデルをデータベースから直接入力したくなるかもしれません。これはオプションですが、正確なものではありません。モデルは、ビューを表示するための単なるパッケージです。しかし、これらのことは、コントローラの名目上の参加だけで、ビジネスロジックレベルで別の場所に準備する必要があります。

0

私の意見では、コメントはブログ投稿に属していますが、なぜブログ投稿モデルにコメントのコレクションを作成しないのですか?それはドメインモデリングのスタンドポイントから理にかなっていますし、使用しているORMがコントローラのロジックを簡素化するそのコレクションを遅延ロードすることをサポートしているかどうかは間違いありません。

1

私は常に厳密に型指定されたビューを使用し、各ビューまたはビューのユーザーコントロールに対してプレゼンテーションモデルクラスを作成します。利点は、プレゼンテーションモデルクラスだけを見ることによって、ビューが使用する値が正確であることが分かります。ドメインモデルを渡していた場合、ドメインモデルには、ビューが使用しない多くのプロパティが含まれている可能性があります。ビューのマークアップを調べて、必要な値を把握する必要があります。プレゼンテーションモデルは、通常、ドメインモデルでは利用できない特定のプロパティを追加します。ちょっと退屈なようですが、時間を節約し、長期的にはコードを良くすると思います。

関連する問題