ViewModels还是ViewBag?

Rid*_*ick 33 viewmodel viewbag asp.net-mvc-4

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

基本上,是否应该通过视图模型完成所有操作,还是可以合并viewbag?

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

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

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

Dar*_*rov 49

基本上,是否应该通过视图模型完成所有操作,还是可以合并viewbag?

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

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

@Html.DropDownListFor(x => x.ProductId, Model.Products)
Run Code Online (Sandbox Code Playgroud)

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

  • 当然有.您可以获得Intellisense,并且可以在视图中使用强类型的Html帮助程序版本.您还可以获得重构友好代码,不再依赖魔术字符串.此外,只需查看此视图​​强类型化的视图模型,即可清楚地将信息传递到给定视图.如果您使用ViewModels和ViewBag的混合,您还应该查看设置ViewBag的控制器操作. (10认同)

Tim*_*ell 15

身高的ViewModelsViewBag的地方就可以了.创建强类型视图.它使您的代码更清晰,更不易碎,更不容易出错,并且易于维护.

ViewBags只是动态类型对象的字典,所以你输了:

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

对于大量使用ViewBag的奖励积分,也忽略了使用MVC模式的重点

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


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