在一个理想的“你好世界”中。一个人应该将强类型模型传递回视图。
return View(MyModel);
如果事情变得棘手,我们可以创建一个
视图模型
return View(MyViewModel);
离。
MyViewModel
我可以避免创建整个 ViewModel
并部分使用 ViewBag 。
ViewBag.Foo = Foo;
return View(MyModel);
我意识到我将失去一些强类型功能
(例如Intellisense)
在我的ViewBag视图中。
这种做法是不是很草率?反对MVC代表什么?
如果是这样,ViewBag的重点是什么?
答案 0 :(得分:5)
我所知道的最有用的用例是带外数据,例如可能在每个页面上显示的消息。动作过滤器可以有条件地将该消息添加到ViewBag。您可能不希望修改每个视图模型类以保存该无关消息,因为它可能是一个跨领域的问题。这种消息/小部件的一个例子是Stack Overflows中断公告。
我不建议使用视图模型的ViewBag 而不是。模型类方法具有典型的静态类型优势,而且编写类的成本很低。
答案 1 :(得分:1)
这是一个很好的问题,就个人而言,我并不认为有任何意义 - 所有这一切都鼓励“懒惰”编码。 dynamic
个对象有其用途,但是,我不认为ViewBag
是其中之一,我更愿意使用ViewData[]
/ ViewModel
并获取我的类型 - 安全在那里,特别是当我知道我正在处理的类型时。
答案 2 :(得分:1)
我没有遇到过将ViewBag用于替代方案(正确结构化的视图模型)是有益的。其他一些答案提到将它用于需要在每个页面上显示的数据。在这种情况下,您应该创建一个所有ViewModel继承的基本ViewModel类。我使用这种结构来存储登录用户等。
在我看来,ViewBag有一个目的:在编写最少的代码时,轻松快速地提供ASP.NET MVC的产品演示。它不是构建代码的最佳方式,但它销售产品。