Asp.net-Mvc

MVC ViewBag 最佳實踐 [關閉]

  • June 29, 2012

對於 ViewBag,我聽說它是禁止使用的。我會假設應該將 ViewBag 中的內容合併到視圖模型中?

題:

  1. 我的假設是否高於最佳實踐。(不要使用 ViewBag,其次要在視圖模型中使用它)
  2. 是否存在絕對需要 ViewBag 的情況?

ViewBag 是一個動態字典。因此,當使用 ViewBag 在操作方法和視圖之間傳輸數據時,如果您在嘗試訪問視圖中的 ViewBag 項時在程式碼中出現拼寫錯誤,編譯器將無法捕捉到。您的視圖將在執行時崩潰:(

通常,使用視圖模型在您的操作方法和視圖之間傳輸數據是一個好主意。視圖模型是一個簡單的 POCO 類,它具有特定於視圖的屬性。因此,如果您想向視圖傳遞一些額外的數據,請向您的視圖模型添加一個新屬性並使用它。強類型視圖使程式碼更清晰,更易於維護。使用這種方法,您不需要來回將您的 viewbag 字典項顯式轉換為某些類型,而這與 view bag 相關。

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 發送數據。例如,您想在 Layout 頁面上顯示某些內容,您可以使用 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>

引用自:https://stackoverflow.com/questions/11262034