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

标签 asp.net-mvc razor viewbag

对于 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/

相关文章:

c# - 使用 jQuery AJAX 将多个变量发布到 ASP .NET MVC Controller

html - Bootstrap 标签和输入未水平对齐

javascript - 为什么Viewbag不显示在asp.net mvc View 页面中?

layout - 布局页面在~/Views/Shared之外时,为什么Razor看不到ViewBag、Url.Content等?

asp.net-mvc - ViewBag 访问性能

asp.net-mvc - 引用位于 area 中的 css 文件

javascript - Angular 提示缺少一个根本没有声明的模块我

asp.net-mvc - Postman 4.9.3 - 没有拦截器开关

javascript - 实时更新标签值不起作用

c# - 如何在 C# 中的字典上实现 linq?