我看到了对“最佳实践”的引用,但为什么在视图中访问静态数据时使用ViewBag对象而不是Application对象更好?
两者都有可能。假设您想要为每个视图添加一个对象,但不一定要传递它来查看模型(因为甚至可能没有给定视图的模型)?
这可以通过多种方式完成,例如使用全局过滤器,但访问应用程序变量更方便。
答案 0 :(得分:1)
两者都是令人讨厌的变通办法,它绕过了MVC所代表的一切。
在模型 - 视图 - 控制器模式中,您的Controller准备一个模型,其中包含填充视图所需的所有值,而视图依次以其意图的方式显示模型属性。
用于规避该模式的任何方式,如ViewBag,Session或Application变量,都是违反MVC方式的反模式 - 只要您直接从View访问这些变量。
另请参阅Pass data to layout that are common to all pages和Create ViewModel for Navigation:如果您需要在所有网页上使用某些值,请考虑使用基本视图模型或部分视图。
是的,这个讨论与实用主义/纯粹主义接近。例如,如果您的菜单对于每个用户都是相同的,但是从数据库加载,那么请确保将其存储在Application变量中以进行缓存,以便每个AppDomain加载一次。但是仍然使用基本ViewModel或Partial来渲染该菜单。
答案 1 :(得分:1)
我不会说将数据放入视图包是最佳做法。我会说使用视图模型是一种最佳实践。
假设您想要将对象添加到每个视图但不一定要传递 它来查看模型(因为甚至可能没有给定的模型 视图)。
即使您没有定义视图模型,概念上也有一个模型是您将数据传递给视图。
如果数据在每个视图上,您可以创建一个基本视图模型,每个模型都继承包含通用数据的模型。
您还可以创建具有自己的视图模型的局部视图,然后将其应用于每个页面。
答案 2 :(得分:0)
通常我会考虑应用程序的业务或功能概念来设计ViewModels。 例如,如果要显示发票,则视图模型应包含与需要在该特定视图上显示的发票相关的所有属性。我不会为此目的使用ViewBags / ViewData。
在ViewBag上,我通常会将其他"更多辅助"例如,一个布尔值,用于显示/隐藏视图的某些部分,或者可能用于其他一些"不与业务相关的"属性。
当然有些人可能不同意这一点,并且会将所有内容都放在Viewmodels上,其他人则不会。这是您在开始时必须做出的决定,因此您可以在整个应用程序中设计一致的方式。