对于 ViewBag,我听说这是一个禁忌。 我认为 ViewBag 中的内容应该合并到 View 模型中?
问题:
我的假设是否高于最佳实践? (不要使用 ViewBag,其次要将它放在 View 模型中)
在某些情况下 ViewBag 是绝对必要的吗?
最佳答案
ViewBag是一个动态字典。因此,当使用 ViewBag 在操作方法和 View 之间传输数据时,如果您在尝试访问 View 中的 ViewBag 项时在代码中输入错误,编译器将无法捕获。您的 View 将在运行时崩溃:(
通常,使用 View 模型在操作方法和 View 之间传输数据是个好主意。 View 模型是一个简单的 POCO 类,它具有特定于 View 的属性。因此,如果您想传递一些额外的数据来查看,请向 View 模型添加一个新属性并使用它。强类型 View 使代码更干净且更易于维护。通过这种方法,您不需要将 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;}
}
并在您的操作方法中,创建此 View 模型的对象,加载属性并将其发送到 View 。
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);
}
以及您的 View ,它是强类型化到 View 模型的,
@model ProductsForCategoryVm
<h2>@Model.CategoryName</h2>
@foreach(var item in Model.Products)
{
<p>@item.Name</p>
}
下拉数据?
许多教程/书籍都有使用 ViewBag 获取下拉数据的代码示例。我个人仍然认为ViewBag不应该用于此目的。它应该是 List<SelectListItem
类型的属性> 在您的 View 模型中传递下拉数据。这是post并提供有关如何执行此操作的示例代码。
Are there situations where a ViewBag is absolutely necessary?
在一些有效的用例中,您可以(不必要)使用 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>
关于asp.net-mvc - MVC ViewBag 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11262034/