web-dev-qa-db-ja.com

MVC.NETでのViewBagとモデル

これは、より一般的なアーキテクチャの質問です。

プログラマーが「ViewBags」を使用して、すでにモデルを受け入れているビューにデータを渡してもよいかどうかを判断しようとしています。

私の個人的な好みは、ViewBagsを避け、ビューに必要なすべてのデータを含む堅牢なモデルを構築することです。

アプローチ1:

MODEL A: 
- List of Employees
- Nullable integer, indicating which item from the list is currently selected
- string firstName (empty if index is null)
- string lastname (empty if index is null)

アプローチ2:

MODEL A: 
- List of Employees

ViewBag:
- ViewBag.Index (indicating which item from the list is currently selected)
- ViewBag.FirstName
- ViewBag.LastName

なぜアプローチ2がアプローチ1よりも優れているのかという議論を誰かが考えることができますか?

ご入力いただきありがとうございます

15
DotNet98

私の意見では、決して使用しないでくださいViewBag非常に正当な理由なしにブラッドトーマスの答え これらの正当な理由の1つのまれな例を指摘します。

ウェブサイト全体で共有されるマスター レイアウト (または 部分ビュー )と、それぞれが独自のモデルを持つ多数の強く型付けされたビューがあるとします。レイアウトにデータをどのように渡しますか?私が見たいくつかの戦略:

  1. すべてのモデルにレイアウトプロパティを追加します。

多くのモデルがない場合、または1つまたは2つの追加プロパティしかない場合は、これで機能する可能性があります。これはすぐにメンテナンスの悪夢になる可能性があります。

  1. すべてのモデルがレイアウトデータを保持するクラスから継承するようにします。

ModelBaseクラスの作成は避けていますが、必要になる場合があります。

  1. レイアウトのモデルと汎用モデルの基本クラスを作成します。

どのビューでも利用できるいくつかのレイアウトのMVCアプリを見てきました。モデルが基本クラスを継承している場合は、レイアウトごとに基本クラスが必要になる場合があります。作業の重複を避けるために、レイアウトごとにレイアウトモデルを作成します。次に、このようなものがあなたのために働くかもしれません:

abstract class ModelBase<TLayout> {
    public TLayout Layout { get; set; }
}

class Model : ModelBase<LayoutModel2> { /* model stuff here */ } 
  1. レイアウトプロパティをViewBagに配置します

モデルにレイアウト情報を配置することが適切でない場合、私が想像できるまれな状況があります。ドメインモデルをモデルとして使用することは非常に一般的であるように思われます。たとえば、レイアウト/ビューデータをビジネス/ドメインデータと混合したくない場合があります。


ViewBagを使用する場合は、次のことを避けてください。

ViewBag.Title = "My page"
ViewBag.UserID = 123
ViewBag.UserName = "admin"
ViewBag.UserDisplayName = "Administrator"

さまざまな場所でさまざまな大文字を使用するなど、明らかな潜在的な問題があります(たとえば、UserIdの代わりにUserID)。あまり明白ではないのは、誰かが誤ってViewBag.UserIDstringまたはNullable<int>に設定する可能性があることです。

class SomeOtherClass {
    public string UserID { get; set; } // someone uses a string...
}

ViewBag.UserID = someOtherClassObj.UserID; // now you're in trouble.

したがって、ViewBagを使用する必要がある場合は、次のようなものをお勧めします。

ViewBag.LayoutModel = new LayoutModel { UserID = User.ID, UserName = User.Name };
16
David Schwartz

モデルは厳密に型指定されているため、個人的にはパラメーターとしてモデルを選択します。そのため、ビューに渡すときに、パラメーターが有効かどうかをフィールドキーワードで制御することもできます。そして、モデルは将来のコード保守のための最良の方法です。

このための参照:

ビューバッグを避ける

5
Deddy H

ビューのレイアウトに情報を渡すとき

4
Brad Thomas

使えますか?承知しました。あなたはそれを使うべきですか?他に何をしようとしているかによります。通常、ViewBagは、ページのタイトルなどのデータを送信するために予約されています。データベースから入力されたパラメーターをモデルに保持することをお勧めします。主な理由は、モデルのバインドと、モデルの検証を実行したい場合です。

2
Gjohn

シナリオによって異なります。渡したいフィールドがこの特定のビューで使用され、エンティティまたはモデルの一部として作成されない場合は、ビューバッグを使用します。それ以外の場合はモデルにします。

1
ZAK