MVC ViewBag ベストプラクティス [closed] 質問する

MVC ViewBag ベストプラクティス [closed] 質問する

ViewBag については、使用してはいけないと聞きました。ViewBag のコンテンツをビュー モデルに組み込む必要があると思いますか?

質問:

  1. 私の仮定はベストプラクティスの上にあります。(ViewBag を使用しないことと、それをビューモデルに配置すること)

  2. ViewBag が絶対に必要な状況はありますか?

ベストアンサー1

ViewBag は動的辞書です。そのため、アクション メソッドとビュー間でデータを転送するために ViewBag を使用する場合、ビュー内の ViewBag 項目にアクセスしようとしたときにコードにタイプミスがあっても、コンパイラはそれを検出できません。実行時にビューがクラッシュします :(

一般的に、アクション メソッドとビューの間でデータを転送するには、ビュー モデルを使用することをお勧めします。ビュー モデルは、ビューに固有のプロパティを持つ単純な POCO クラスです。そのため、ビューに追加のデータを渡す場合は、ビュー モデルに新しいプロパティを追加してそれを使用します。厳密に型指定されたビューにより、コードがよりクリーンになり、保守が容易になります。このアプローチでは、ビュー バッグで行う必要がある、ビューバッグ ディクショナリ項目をいくつかの型に明示的にキャストする必要がありません。

public class ProductsForCategoryVm
{
  public string CategoryName { set;get; }
  public List<ProductVm> Products { set;get;}    
}
public class ProductVm
{
  public int Id {set;get;} 
  public string Name { set;get;}
}

アクション メソッドでは、このビュー モデルのオブジェクトを作成し、プロパティを読み込んでビューに送信します。

public ActionResult Category(int id)
{
  var vm= new ProductsForCategoryVm();
  vm.CategoryName = "Books";
  vm.Products= new List<ProductVm> {
     new ProductVm { Id=1, Name="The Pragmatic Programmer" },
     new ProductVm { Id=2, Name="Clean Code" }
  }
  return View(vm);
}

そして、ビューモデルに強く型付けされたビューは、

@model ProductsForCategoryVm
<h2>@Model.CategoryName</h2>
@foreach(var item in Model.Products)
{
    <p>@item.Name</p>
}

ドロップダウンデータ?

多くのチュートリアルや書籍には、ドロップダウンデータにViewBagを使用するコードサンプルがあります。個人的には、ViewBagはこれに使用すべきではないと感じています。List<SelectListItemドロップダウンデータを渡すには、ビューモデルの>型のプロパティである必要があります。ここに役職それを実行する方法のサンプルコード付き。

ViewBag が絶対に必要な状況はありますか?

いくつかの有効な使用例があります(必要はありません) ViewBagを使用してデータを送信します。たとえば、レイアウトページに何かを表示したい場合は、ViewBagを使用できます。別の例は次のとおりです。ViewBag.Title (ページタイトル用) はデフォルトの MVC テンプレートに存在します。

public ActionResult Create()
{
   ViewBag.AnnouncementForEditors="Be careful";
   return View();
}

そしてレイアウトでは、ViewBag.AnnouncementForEditors

<body>
<h1>@ViewBag.AnnouncementForEditors</h1>
<div class="container body-content">
    @RenderBody()
</div>
</body>

おすすめ記事