gpt4 book ai didi

asp.net-mvc - MVC ViewBag 最佳实践

转载 作者:行者123 更新时间:2023-12-02 05:05:24 24 4
gpt4 key购买 nike

对于 ViewBag,我听说这是一个禁忌。我认为 ViewBag 中的内容应该合并到 View 模型中?

问题:

  1. 我的假设是否高于最佳实践? (不要使用 ViewBag,其次要将它放在 View 模型中)

  2. 在某些情况下 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com