ViewModels还是ViewBag?

时间:2012-12-08 16:18:11

标签: asp.net-mvc-4 viewmodel viewbag

我是MVC4,EF5和ASP.Net的新手,我似乎无法在任何地方找到一个好的答案。

基本上,一切都应该通过viewmodel完成,还是可以合并viewbag?

假设我有一个填充下拉列表的方法,我使用viewmodel来表示视图的输出。

我可以使用Viewbag.DropDown = PopulateDropdown();或者更好地合并 这个进入ViewModel,通过创建一个属性来保存List<SelectListItem>创建的PopulateDropdown();

我知道ViewBag有多方便,但是我还没有看到任何坚实的理由不使用它?如果有人也能为我提供更多的见解,那就太棒了。

2 个答案:

答案 0 :(得分:48)

  

基本上,一切都应该通过viewmodel完成,还是好的   还包含viewbag?

一切都应该在视图模型中完成。这就是视图模型。您专门定义的类,以满足视图的要求。不要将ViewBags与ViewModels混合使用。对于查看来自何处的信息不再清楚。要么只使用视图模型(我推荐的方法),要么只使用ViewBags。但是不要混淆2。

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

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

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

答案 1 :(得分:14)

ViewBag 上首选 ViewModels ,无论您身在何处。创建强类型视图。它使您的代码更清晰,更不易碎,更不易出错,并且易于维护。

ViewBags 只是动态类型对象的字典,因此您输了:

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

对于大量使用 ViewBag 的奖励积分,也忽略了使用MVC pattern

的重点

我得到的印象ViewBags是为解决asp.net中的边缘案例问题而创建的,人们使用它们而不是创建最初用于平台设计的视图模型,从而损害了他们的工作。

感谢Why not to use ViewBag heavily?