38

我对 MVC4、EF5 和 ASP.Net 还很陌生,而且我似乎无法在任何地方找到一个好的答案。

基本上,一切都应该通过视图模型完成还是可以合并视图包?

假设我有一个填充下拉列表的方法,并且我正在使用视图模型来表示视图的输出。

我可以使用Viewbag.DropDown = PopulateDropdown();还是将它合并到 ViewModel 中,通过创建一个属性来保存List<SelectListItem>创建者PopulateDropdown();

我知道 ViewBag 有多方便,但我还没有看到任何不使用它的充分理由?如果有人也可以为我提供更多见解,那就太好了。

4

2 回答 2

55

基本上,一切都应该通过视图模型完成还是可以合并视图包?

一切都应该在视图模型中完成。这就是视图模型。您为满足视图要求而专门定义的类。不要将 ViewBags 与 ViewModels 混合使用。信息从何而来的观点不再清晰。要么只使用视图模型(我推荐的方法),要么只使用 ViewBags。但是不要混用2。

因此,在您的特定示例中,您将在视图模型上有一个类型的属性,IENumerable<SelectListItem>并且在您的视图中,您将使用 Html.DropDownListFor 帮助器的强类型版本绑定到模型:

@Html.DropDownListFor(x => x.ProductId, Model.Products)

显然,这些只是我的 2 美分。其他人会说混合 ViewModels 和 ViewBags 很好,我尊重他们的意见。

于 2012-12-08T16:20:51.193 回答
22

尽可能选择ViewModel而非ViewBag 。创建强类型视图。它使您的代码更清晰、更不易碎、更不易出错且易于维护。

ViewBags只是动态类型对象的字典,因此您会丢失:

  • 编译时检查
  • 自信地重构的能力(你失去了工具的支持)
  • IDE 支持 - 例如导航到所有用法的能力
  • 智能感知

为了获得奖励积分,大量使用ViewBag也错过了使用MVC 模式的重点

我的印象是 ViewBags 是为了解决 asp.net 中的一个边缘问题而创建的,人们使用它们而不是像最初在平台设计中那样创建视图模型,这不利于他们的工作。


感谢为什么不大量使用 ViewBag?

于 2016-05-18T10:30:06.080 回答