これは、より一般的なアーキテクチャの質問です。
プログラマーが「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よりも優れているのかという議論を誰かが考えることができますか?
ご入力いただきありがとうございます
私の意見では、決して使用しないでくださいViewBag
非常に正当な理由なしに。 ブラッドトーマスの答え これらの正当な理由の1つのまれな例を指摘します。
ウェブサイト全体で共有されるマスター レイアウト (または 部分ビュー )と、それぞれが独自のモデルを持つ多数の強く型付けされたビューがあるとします。レイアウトにデータをどのように渡しますか?私が見たいくつかの戦略:
多くのモデルがない場合、または1つまたは2つの追加プロパティしかない場合は、これで機能する可能性があります。これはすぐにメンテナンスの悪夢になる可能性があります。
ModelBase
クラスの作成は避けていますが、必要になる場合があります。
どのビューでも利用できるいくつかのレイアウトのMVCアプリを見てきました。モデルが基本クラスを継承している場合は、レイアウトごとに基本クラスが必要になる場合があります。作業の重複を避けるために、レイアウトごとにレイアウトモデルを作成します。次に、このようなものがあなたのために働くかもしれません:
abstract class ModelBase<TLayout> {
public TLayout Layout { get; set; }
}
class Model : ModelBase<LayoutModel2> { /* model stuff here */ }
ViewBag
。に配置しますモデルにレイアウト情報を配置することが適切でない場合、私が想像できるまれな状況があります。ドメインモデルをモデルとして使用することは非常に一般的であるように思われます。たとえば、レイアウト/ビューデータをビジネス/ドメインデータと混合したくない場合があります。
ViewBag
を使用する場合は、次のことを避けてください。
ViewBag.Title = "My page"
ViewBag.UserID = 123
ViewBag.UserName = "admin"
ViewBag.UserDisplayName = "Administrator"
さまざまな場所でさまざまな大文字を使用するなど、明らかな潜在的な問題があります(たとえば、UserId
の代わりにUserID
)。あまり明白ではないのは、誰かが誤ってViewBag.UserID
をstring
または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 };
モデルは厳密に型指定されているため、個人的にはパラメーターとしてモデルを選択します。そのため、ビューに渡すときに、パラメーターが有効かどうかをフィールドキーワードで制御することもできます。そして、モデルは将来のコード保守のための最良の方法です。
このための参照:
ビューのレイアウトに情報を渡すとき
使えますか?承知しました。あなたはそれを使うべきですか?他に何をしようとしているかによります。通常、ViewBagは、ページのタイトルなどのデータを送信するために予約されています。データベースから入力されたパラメーターをモデルに保持することをお勧めします。主な理由は、モデルのバインドと、モデルの検証を実行したい場合です。
シナリオによって異なります。渡したいフィールドがこの特定のビューで使用され、エンティティまたはモデルの一部として作成されない場合は、ビューバッグを使用します。それ以外の場合はモデルにします。