Asp.net-Mvc
MVC ViewBag 最佳實踐 [關閉]
對於 ViewBag,我聽說它是禁止使用的。我會假設應該將 ViewBag 中的內容合併到視圖模型中?
題:
- 我的假設是否高於最佳實踐。(不要使用 ViewBag,其次要在視圖模型中使用它)
- 是否存在絕對需要 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>