2011-06-17 6 views
5

一般的なビューモデルを取り入れてビューを作成しようとするとよいでしょうか?汎用ビューモデルですか?

誰かが彼は汎用ビューと汎用ビューモデルを作り始めない限り、彼は重複したコードの多くを行う必要があるために予想したことを述べたので、私はこれを疑問に思って。

基本的に、ビューは単なるコントロールのセットのようになります。 1つのビューには2つのコントロール(テキストボックスとラジオボタンなど)があり、別のビューには50個のコントロールがあります。

これらはすべて同じルックアンドフィールです(コントロールの数だけ増えます)。基本的に彼は、ビューモデルがオブジェクト(ドメインオブジェクト)を取り込み、それを見て50のフィールドを見て、適切なコントロールタイプをレンダリングすると考えていました。

私は編集テンプレートは、私は、一般的なビューモデルで販売されておりませんがコントロールを把握するために使用されることができると思います。

私はジェネリックを好む、彼らは非常に強力なことを行うことができますし、いくつかの状況で、彼らは良いですが、私はそれらについて狂気に全体的なだけではないですし、使用しないようにしてみてください。

重複したコードを減らすことがほとんどの場合わかりますが、コードが複雑になることがあります。もちろん、これは私がまだ比較的新しいプログラミングであり、私のスキルレベルを上回っている可能性があるからです。

次の問題は、ビューモデルはできるだけ平坦で、実際に使用されるデータのみを公開して、ビューに入らないプロパティを使用しないようにすることです最初の場所。

あなたはそれ内のオブジェクトを持ってそれにオブジェクトを持っているいくつかの複雑なオブジェクトを持っている場合、それはちょうど行き続けることができると私はそれを持って次の問題。それは長い間続くことができます。

+0

[私のコードを見てください、私は同様のものを達成しようとしました](https://stackoverflow.com/questions/48750809/generic-view-in-asp-net-core-2-0-using-ラムダ式) – Omar

答えて

3

一般的なViewModelsでは何も問題はありません。 ViewBagとは対照的に、複製を削除してコンパイル時のチェックを続けるのは良い方法です。

例:

など、Category、あなたがProductのモデルクラスのセットを持っている 各クラス(ProductModelCategoryModel)を想像し、適切なビューを生成し、関連するディスプレイと、エディタのテンプレートを持っています。

ここでは、表示と編集のための一連のページを作成します。

私は通常、共通のコンテンツ(など、ヘッダー、フッター、メニューなど)をレンダリングするレイアウト(Webフォームでのマスターページ)を作成

それから私はモデルとして受け入れ、個々の、強く型付けされたビューを作成しますProductViewModelCategoryViewModelなど

今、私たちは、これらのビューモデルクラスを定義する必要があります。各ビューモデルクラスは、ProductModel,CategoryModelなど(テンプレートに渡される)のインスタンスを取る必要があります。しかし、レイアウトには、いくつかの追加データ(つまり、選択されたメニュー、ログインユーザ名など)が必要な場合があります。そして、あなたは簡単にレイアウトがページをレンダリングするために必要なすべてが含まれていた、ProductViewModel : EntityViewModel<ProductModel>を作成することができ、あなたはそこに任意の追加を追加することができます

public class EntityViewModel<T> 
    where T : EntityModel 
{ 
    public T Entity { get; set; } 
    public string UserName { get; set; } 
    public string SelectedMenu { get; set; } 
} 

:私のソリューションは、レイアウトのために、この重複したデータをカプセル化し、汎用のViewModelを作成することです、製品固有のデータ。

+0

@ Jakub Konecki - 例を示してください。私は少なくとも1つを見て、どのように見えるかを見てみたい(おそらくそれはそれとはまったく異なっているかもしれない) – chobo2

+0

だから、EntityはProductModelまたはCategoryModelになりましたか、それともProductViewModelとCategoryViewModelですか? – chobo2

+0

@ chobo2 - 'ProductModel:EntityModel'の最後の文で分かります。 –

1

ViewModelsのところでは、私は通常、MVVMの実装を支援するメソッドを公開するBaseViewModelからすべてのViewModelを継承しています。例を見たい場合は、下記にコメントしてください。

+0

ASP.NET MVCアプリケーションでMVVMパターンを使用していますか?うーん、私はまた、これの例を見ることに興味があるだろう。 –

+0

例を見るのが大好きです。私はそのパターンに精通していません。 – chobo2

+0

一見してasp.netタグが表示されませんでした。MVCではなくSilverlightのようなものでMVVMを使用していると仮定していました。 「ビューモデル」にはMVCの場所がありますか?私は通常、ビューとモデルを別々のエンティティとして見ます。 – NickHeidke

5

個人的には、ビューモデルでジェネリックを使用することは避けてください。私はあなたがそれらに対して述べた理由の大半、特にこの1に同意:

私はそれを持って次の問題は、私はそのビューモデルが 公開可能な限り平坦でのみデータとして されるべきだと思う されています実際にそう 人々が のビューにされてはいけませんプロパティ の使用を開始していない最初の場所

ビューモデルの背後にある考え方は、彼らが特別の要件に縛られる必要があるということである使用することになるだろう特定のビュー、それらを作成しない一般的な(/ジェネリック)ドメインモデルと同じです。ビューモデルでコードを複製するのは、ビューやパーシャル全体で再利用されるいくつかの一般的なモンスターと比べて好きです。

さらに、generate dynamic forms and controlsが必要な場合でも、汎用ビューモデルを使用する必要はありません。

ハイパー特定のシナリオがない限り(現時点では考えることはできません)、ビューモデルではジェネリックを避けるのがよいでしょう。

ジェネリックビューモデルが役立つと思われる状況がある場合は、シナリオを説明してすべてのコードを表示することを躊躇しないでください議論することができます。

+0

私が検索のために見つけた唯一の理由は、200人の恋人や200人の別個のビューモデルを作ってみたいと思う人がいると言ったところです。私はそのような状況で私が何をするのか分かりません。私が追加することを忘れたもう一つの点は、データアノテーションの検証についてです。私はあなたがおそらくそれをドメインオブジェクトに置く必要があると推測しています、そして、それは別のノーノだと思います。 http://stackoverflow.com/questions/2138951/asp-net-mvc-generic-view-for-displaying-dataポスターを表示モデルに言及していないが、彼はおそらくそれらを使用していると仮定している – chobo2

+0

@ダリンディミトロフ私は午前ViewModelをViewからControllerに渡すためだけに使用します。また、そのページ番号、ページサイズ、検索フィルターなど、読み取り、追加/編集/削除操作はありません。一部のコントローラでは、ProductCategoryIdのような余分なパラメータが必要です。余分なフィールドを使用して、新しいViewModelで継承またはコードを複製する必要がありますか? – user2330678

0

私は実際にビジネスロジックをviewmodelの中に置くのが好きではありません。私は、通常のプロパティとコンストラクタ内のエラー処理のほかに、ビューモデルには何も置かないと思う。はるかにクリーンなコードを作成し、モデルを表示するために自由に追加することができます。 多くのコードを複製する必要がある場合は、それを分離してビューモデルに分割し、必要な場所にネストすることができます。 このようにして、必要なものだけをあなたの視点に持っていきます。

+1

ViewModelにロジックを含めることについての質問に何も表示されません。 –

関連する問題