web-dev-qa-db-ja.com

ViewModelsまたはViewBag?

私はMVC4、EF5、ASP.Netにかなり慣れていないので、どこでも良い答えを見つけることができないようです。

基本的に、すべてがビューモデルを通じて行われるべきですか、それともOk viewbagを組み込むことですか?)

ドロップダウンリストを生成するメソッドがあり、ビューの出力を表すためにviewmodelを使用しているとしましょう。

Viewbag.DropDown = PopulateDropdown();を使用してもよろしいですか、またはPopulateDropdown();によって作成されたList<SelectListItem>を保持するプロパティを作成して、これをViewModelに組み込む方が良いでしょうか?

私はViewBagがどれほど便利か知っていますが、それを使用しないという確かな理由はまだわかりませんか?誰かが私にもう少し洞察を提供できるとしたら、それは素晴らしいことです。

34
Riddick

基本的に、すべてがビューモデルを通じて行われるべきですか、それともOk viewbagを組み込むことですか?)

すべてはビューモデル内で行われるべきです。それがビューモデルです。ビューの要件を満たすために具体的に定義するクラス。 ViewBagsとViewModelsを混在させないでください。情報がどこから来るのかは、もはや明確ではありません。ビューモデルのみ(私が推奨するアプローチ)のみを使用するか、ViewBagsのみを使用します。ただし、2つを混ぜないでください。

したがって、特定の例では、IENumerable<SelectListItem>型のビューモデルのプロパティがあり、ビュー内でHtml.DropDownListForヘルパーの厳密に型指定されたバージョンを使用してモデルにバインドします。

@Html.DropDownListFor(x => x.ProductId, Model.Products)

明らかにそれらは私の2セントだけです。他の人々は、ViewModelsとViewBagsを混合することは問題ないと言います。

51
Darin Dimitrov

できる限りViewBagよりもViewModelsを優先してください。強く型付けされたビューを作成します。これにより、コードがよりクリーンになり、壊れにくくなり、エラーが発生しにくくなり、保守が容易になります。

ViewBagsは動的に型付けされたオブジェクトのディクショナリにすぎないため、以下を失うことになります。

  • コンパイル時間チェック
  • 自信を持ってリファクタリングする機能(ツールのサポートを失う)
  • IDEサポート-すべての使用法にナビゲートする機能など
  • Intellisense

ViewBagを多用するボーナスポイントについても、 MVCパターン を使用するポイントを逃します

ViewBagsはasp.netのEdge-case問題を解決するために作成されたものであり、人々は当初、プラットフォームの設計で意図されていたビューモデルを作成する代わりにそれらを使用して、作業に悪影響を与えているという印象を受けます。


おかげで なぜViewBagを多用しないのですか?

16
Tim Abell