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> 的属性,以传递下拉数据。这是一个post,其中包含有关如何执行此操作的示例代码。
是否存在绝对需要 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>