MVC ViewBag最佳实践

Nat*_*Pet 33 asp.net-mvc razor viewbag

对于ViewBag,我听说这是禁止使用的.我会假设ViewBag中的内容应该合并到视图模型中吗?

题:

  1. 我的假设是最佳实践.(不使用ViewBag,第二个在视图模型中使用它)

  2. 是否存在绝对需要ViewBag的情况?

Shy*_*yju 31

ViewBag是一个动态字典.因此,当使用ViewBag在操作方法和视图之间传输数据时,如果在尝试访问视图中的ViewBag项时在代码中输入错误,编译器将无法捕获.您的视图将在运行时崩溃:(

通常,最好使用视图模型在操作方法和视图之间传输数据.view model是一个简单的POCO类,它具有特定于视图的属性.因此,如果要传递一些额外的数据进行查看,请向视图模型添加新属性并使用该属性.强大的类型视图使代码更清晰,更易于维护.使用这种方法,您不需要将viewbag字典项显式地转换为某些类型来回与视图包有关.

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;}
}
Run Code Online (Sandbox Code Playgroud)

在您的操作方法中,创建此视图模型的对象,加载属性并将其发送到视图.

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);
}
Run Code Online (Sandbox Code Playgroud)

并且您的视图是视图模型的强类型,

@model ProductsForCategoryVm
<h2>@Model.CategoryName</h2>
@foreach(var item in Model.Products)
{
    <p>@item.Name</p>
}
Run Code Online (Sandbox Code Playgroud)

下拉数据?

很多教程/书籍都有代码示例,它们使用ViewBag作为下拉数据.我个人仍然认为ViewBag不应该用于此.它应该是List<SelectListItem视图模型中类型> 的属性,以传递下拉数据.这是一篇帖子,其中包含有关如何执行此操作的示例代码.

是否存在绝对需要ViewBag的情况?

有一些有效的用例,您可以(不必要)使用ViewBag发送数据.例如,要在"布局"页面上显示某些内容,可以使用ViewBag.另一个示例是ViewBag.Title (对于页面标题)存在于默认MVC模板中.

public ActionResult Create()
{
   ViewBag.AnnouncementForEditors="Be careful";
   return View();
}
Run Code Online (Sandbox Code Playgroud)

在布局中,您可以阅读 ViewBag.AnnouncementForEditors

<body>
<h1>@ViewBag.AnnouncementForEditors</h1>
<div class="container body-content">
    @RenderBody()
</div>
</body>
Run Code Online (Sandbox Code Playgroud)


Sad*_*ran 31

1)我的假设是否是最佳实践.(不使用ViewBag,第二个在视图模型中使用它)

您应该使用viewmodels而不是通过ViewBag尽可能多地传递数据.

2)是否存在绝对需要ViewBag的情况?

没有ViewBag绝对必要的情况.但是,有些数据我个人更喜欢使用ViewBag而不是View Model.例如,当我需要填充预定义值(即Cities)的下拉框时,我使用ViewBag来携带SelectListItem数组来查看.我不想用这些数据污染我的ViewModel.

  • 与我们(MS)发布的指南一致的出色响应.我只会将其从传递数据更改为传递模型数据(元数据除外)请参阅我的教程底部http://www.asp.net/mvc/tutorials/javascript/working-with-the-dropdownlist-box-and -jquery /检验知识,ASPNET-MVC-支架最下拉列表辅助 (4认同)

Dar*_*rov 5

1)我的假设是否高于最佳实践。(不要使用 ViewBag,然后在视图模型中使用它)

是的。

2) 是否存在绝对需要 ViewBag 的情况?

不。您存储在 ViewBag 中的所有内容都可以进入传递给视图的视图模型。

  • 是的,扔掉它。请。我不想在 ASP.NET MVC 4 中看到。它让我想呕吐。如果您愿意,可以在框架内部使用它,但将其标记为“内部”,这样开发人员就不必面对它。 (8认同)