Asp.net mvc 4 ViewModels还是ViewBag?

Asp.net mvc 4 ViewModels还是ViewBag?,asp.net-mvc-4,viewmodel,viewbag,Asp.net Mvc 4,Viewmodel,Viewbag,我是MVC4、EF5和ASP.Net的新手,似乎在任何地方都找不到好的答案 基本上,一切都应该通过viewmodel完成,还是也可以合并viewbag 假设我有一个填充下拉列表的方法,我使用viewmodel来表示视图的输出 我可以使用Viewbag.DropDown=PopulateDropdown()吗还是合并更好 通过创建一个属性来保存由PopulateDropdown()创建的列表,可以将其保存到ViewModel中 我知道ViewBag有多方便,但我还没有找到任何理由不使用它?如果有人

我是MVC4、EF5和ASP.Net的新手,似乎在任何地方都找不到好的答案

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

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

我可以使用
Viewbag.DropDown=PopulateDropdown()吗还是合并更好
通过创建一个属性来保存由
PopulateDropdown()创建的
列表
,可以将其保存到ViewModel中

我知道ViewBag有多方便,但我还没有找到任何理由不使用它?如果有人能给我提供更多的见解,那就太好了

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

一切都应该在视图模型内完成。这就是视图模型。为满足视图的要求而专门定义的类。不要将ViewBags与ViewModels混合使用。对于视图来说,信息从何而来已不再清晰。要么只使用视图模型(我推荐的方法),要么只使用ViewBags。但是不要把这两种东西混在一起

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

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

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

尽可能选择ViewModels而不是ViewBag。创建强类型视图。它使您的代码更干净、更不脆弱、更不容易出错,并且易于维护

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

  • 编译时检查
  • 自信重构的能力(你失去了工具的支持)
  • IDE支持—例如导航到所有用途的能力
  • 智能感知
对于奖励积分,大量使用查看包也忽略了使用

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



感谢

谢谢,除了ViewBag提供的抽象之外,使用ViewModels比ViewBag还有其他好处吗?当然有。您可以获得Intellisense,并且可以在视图中使用Html帮助程序的强类型版本。您还可以获得一个对重构友好的代码,不再依赖于神奇的字符串。另外,通过只查看强类型化视图的视图模型,可以清楚地知道给定视图的信息来自何处。如果您混合使用ViewModels和ViewBag,还应查看设置ViewBag的控制器操作。此外,您还可以使用数据注释并使控制器接收ViewModels。比如:public-redirectoroutesult-Add(int-id,SomeObjectViewModel-someObject){…}如何添加默认值?我不同意这是二者的混合本身的问题。在对表单的其余数据使用视图模型时,使用viewbag拉入下拉列表数据可能是合理的。话虽如此,我不喜欢使用viewbag,因为它缺乏编译时检查、intellisense和IDE支持(导航到定义、查找用法等)。我想你可以在你的回答中说得更清楚,这是viewbags的一大缺点。我一直在关注intellisense。这不是一个问题;您只需在视图中声明/转换它,就拥有intellisense。我承认我不使用viewmodels(可能是因为懒惰),但考虑到很容易获得intellisense,使用viewbag似乎没有什么麻烦。如果在视图中声明它,则与创建viewmodel的方式相同,您拥有intellisense。viewbag类型是给定的任何类型-您知道给定的对象,因此可以在视图中创建相同的对象。例如,如果您有一个对象列表,您可以在靠近页面顶部的视图中声明该列表,并将viewbag发送给它。我可以做一个viewmodel或viewbag-两者都不比另一个好看。除非您直接在视图上使用viewbag,否则Intellisense肯定不会有问题。我不是在寻求帮助,只是声明可以将viewbag配置为使用Intellisense。我现在更倾向于使用viewmodels。我只是在考虑/研究是否更多地使用viewmodels时看到了这个页面。