ViewBag中的对象

本文关键字:对象 ViewBag | 更新日期: 2023-09-27 18:29:24

我已经开始使用MVC 3了,我真的很喜欢使用它。在很多层面上,它都比WebForms更好。

然而,我对ViewBag(新的ViewData)有一个问题我非常谨慎地坚持合理的建模实践,我倾向于将视图所需的一切都放入ViewModels中。然而,就ViewBag而言,除了糟糕的建模实践表明ViewBag应该谨慎使用之外,还有其他问题吗?我自己不怎么使用它,但一位队友今天问了这个问题,我只能建议限制它的使用,因为它是一个弱类型的模型,使用动态(sudo类型)被黑客攻击很酷

我可以告诉你,使用它不会对性能产生任何影响吗?我说得对吗?它只是get应用于视图服务器端的另一个对象。我不计算使用动态对性能的任何影响(如果有可以测量的话)

您对使用ViewBag的缺点(甚至优点)有何看法?

ViewBag中的对象

对我来说,最大的问题是ViewBag不是类型安全的,如果不小心,很容易产生运行时错误。

视图包实际上只是一种方便,可以防止出现需要新视图模型的简单情况。我经常使用它们,但只用于非常简单的数据。

来自我的帖子:http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

甚至内置的模板也为我们提供了对ViewBag的支持。脚手架模板创建ViewBag.SomeEnumerable用于我们的页面。当然,它的快速代码和自动生成的代码可能会正常工作。问题在于ViewBag是一个动态对象。没有编译时类型检查。如果你拼错了什么,编译器不会通知你。我见过这种用法如此糟糕,我希望看到它的使用得到遏制,应用程序得到清理。因此,在控制器中:ViewBag.SomeProperty="10"并且在视图中:@ViewBag.Som3Pr0p3rty我们永远不会知道这个错误。它甚至不会生成运行时错误,因为拼写错误的名称只生成了一个null。使用ViewModels并避免这些潜在问题。我们的模板也在ViewBag中设置了页面标题。设置页面标题有几个选项。既然这是一个众所周知的财产,人们可能会争辩说,仅仅将其用于所有权是可以的。我不会争辩这一点。还有其他选择。1.将其设置在布局中的一个部分中,并从客户端进行渲染。2.使用ViewBag.Title3.使用过滤器(对于标题来说似乎太复杂了)4.使用模型标题字段。由于默认情况下我们创建了一个ViewBag.Title字段,我们的模板也默认获得它,所以在这种情况下,我会接受它。选择列表呢?而不是默认ViewBag.CustomerId=新SelectList(db.Customers,"CustomerId","FirstName",order.CustomerId);做一些类似的事情yourViewModel.Customers=客户//已加载的集合在你看来@Html.DropDownListFor(x=>x.CustomerId,new SelectList(Model.Customers,"CustomerId","Name")或者,如果您希望将ViewModel设置为包含SelectListyourViewModel.Customers=新SelectList(db.Customers,"CustomerId","Name",order.CustomerId);现在您的视图会稍微清晰一些,如下所示:@Html.DropDownListFor(x=>x.CustomerId,x.Customers)看,现在没那么难了吧?享受