MVC ViewBag最佳实践MVC ViewBag最佳实践(MVC ViewBag Best Pr

2019-06-14 09:23发布

对于ViewBag,我听说那是一个没有没有使用。 我假设有从ViewBag内容应纳入视图模型?

题:

  1. 是我的假设之上的最佳实践。 (不使用ViewBag和第二有它在视图模型)

  2. 有没有一个地方是ViewBag绝对必要的情况呢?

Answer 1:

ViewBag是一个动态的字典。 因此,使用ViewBag转移的操作方法和视图之间的数据时,你的编译器将无法赶上,如果你试图访问视图中的ViewBag项目时,在你的代码做一个印刷工。 你的看法会崩溃在运行时:(

一般来说是使用视图模型到你的操作方法和视图之间传输数据是个好主意。 视图模型是具有特定于该视图属性的简单POCO类。 所以,如果你想通过一些额外的数据查看,一个新的属性添加到您的视图模型,并使用that.Strongly类型的视图使代码更清洁,更易于维护。 通过这种方法,你不必做你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;}
}

而在你的操作方法,创建这个视图模型的对象,加载性能,发送到视图。

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 >在视图模型通过下拉的数据。 这里是一个职位与示例代码如何做到这一点。

有没有一个地方是ViewBag绝对必要的情况呢?

在有些情况下,你可以( 不是必须 )使用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>


Answer 2:

1)是我的假设之上的最佳实践。 (不使用ViewBag和第二有它在视图模型)

您应该使用的,而不是通过ViewBag传递数据尽可能的ViewModels。

2)是否有其中ViewBag是绝对必要的情况呢?

有没有情况,即ViewBag是绝对必要的。 不过,也有一些数据我个人比较喜欢使用ViewBag而不是视图模型。 例如,当我需要填充预定义值的下拉框(即城市),我使用ViewBag用于承载SelectListItem阵列进行查看。 我宁愿不污染我的ViewModels与此数据。



Answer 3:

1)是我的假设之上的最佳实践。 (不使用ViewBag和第二有它在视图模型)

是。

2)是否有其中ViewBag是绝对必要的情况呢?

号,你已经存储在ViewBag一切都可能进入传递给视图的视图模型。



Answer 4:

与ViewBags和推荐的最佳实践问题归结编译时间检查。 ViewBags只是词典和与您获得“魔力”的字符串,因此,如果你最终改变viewbag项目或密钥名之一的对象类型,你不会知道,直到运行时,即使您使用预编译的意见<MvcBuildViews>true</MvcBuildViews>

坚持查看模型是最好的,即使你不得不改变他们现在并再次以适应特定的视图。



Answer 5:

我已经发现了一些使用了ViewBag那里是所有网页上的常见功能,并正在显示不依赖于网页上的功能。 例如,假设您正在构建的StackOverflow。 该工作板出现在每个页面上,但显示的作业有无关的页面(我使用的是概念相似)。 添加属性,每个视图模型将是困难且费时,而且很多无用的东西你的测试。 我不认为这是值得的,在这种情况下。

我已经使用与跨领域数据的基础ViewModel类,但如果你不止一个(例如,就业和堆栈交换站点列表),您可能已开始馅的额外数据,或视图模型的一些其他虐待,再加上你需要一个视图模型生成器来填充基础数据。

至于魔术串的问题,有很多解决方案。 常量,扩展方法,等等。

说了这么多,如果你有显示你的页面依赖于页面的上下文的东西,一个ViewModel是你的朋友。

埃里克



Answer 6:

  1. 否。使用的ViewModels 。
  2. 不,如果你设计一个完美的视图模型,你永远需要一个ViewBag。


Answer 7:

如果您不能重新设计现有视图模型使用ViewBag。



Answer 8:

2.Are存在这样一种ViewBag是绝对必要的情况呢?

在某些情况下,你需要从整个布局,视图和局部视图控制器共享您的数据。 在这种情况下,ViewBag是非常有益的,我怀疑有什么更好的办法。



Answer 9:

如果没有用例,它不会在第一时间实施。 是的,你可以做一切与的ViewModels,但如果你并不真的需要吗? 一个这样的场景正在编辑的实体。 您可以直接传递DTO的一种模式。

@model CategoryDto
<div class="md-form form-sm">
    <input asp-for="Name" class="form-control">
    <label asp-for="Name">("Category Name")</label>
</div>

但是,如果你想要选择类别父? 实体DTO最好只拥有它自己的价值,所以来填充你使用ViewBag选择列表

<select asp-for="ParentId" asp-items="ViewBag.ParentList">
    <option value="">None</option>
</select>

为什么这样做? 好吧,如果你有50种带有某种来自不同的价值选择每个实体的,你只是避免产生额外50周的ViewModels。



Answer 10:

我想我会说出我的意见这一点,因为我已经广泛使用的ViewBag。

你会使用它得到的唯一真正的好处是对于一个小项目,或者在你有一个新的项目,只是想拿到球滚动,而不必担心创建的模型类的负载情况。

当你的项目是比较成熟的,你可能会发现因使用弱类型都在你的应用程序意外的行为问题。 逻辑可能会造成混淆,难以测试和难以解决的,当事情出错。

其实我去倒完全从我的应用程序移除ViewBag,并通过抛出编译错误阻止其他开发商在相同的代码中使用它,当他们尝试,甚至在剃刀意见的路线。

下面是在GitHub上的样本ASP.NET 5项目中,我已经删除它: https://github.com/davidomid/Mvc5NoViewBag

而这里的一篇博客文章中,我解释了删除它的动机和对解决方案是如何工作的解释: https://www.davidomid.com/hate-the-aspnet-mvc-viewbag-as-much-as-i-做-继承人-如何去除的,它



文章来源: MVC ViewBag Best Practice