Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 为什么在视图中使用ViewBag而不是应用程序[“x”]?_Asp.net_Asp.net Mvc - Fatal编程技术网

Asp.net 为什么在视图中使用ViewBag而不是应用程序[“x”]?

Asp.net 为什么在视图中使用ViewBag而不是应用程序[“x”]?,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,我看到了对“最佳实践”的引用,但为什么在访问视图中的静态数据时使用ViewBag对象比使用应用程序对象更好 两者都有可能。假设您希望向每个视图添加对象,但不一定要将其传递给视图模型(因为给定视图甚至可能没有模型) 这可以通过几种方式来实现,比如使用全局过滤器,但是访问应用程序变量要方便得多。这两种方法都是令人讨厌的变通方法,绕过了MVC所代表的一切 在“模型-视图-控制器”模式中,控制器准备一个包含填充视图所需的所有值的模型,然后视图按预期方式显示模型属性 任何绕过该模式的方法,如ViewBag

我看到了对“最佳实践”的引用,但为什么在访问视图中的静态数据时使用ViewBag对象比使用应用程序对象更好

两者都有可能。假设您希望向每个视图添加对象,但不一定要将其传递给视图模型(因为给定视图甚至可能没有模型)


这可以通过几种方式来实现,比如使用全局过滤器,但是访问应用程序变量要方便得多。

这两种方法都是令人讨厌的变通方法,绕过了MVC所代表的一切

在“模型-视图-控制器”模式中,控制器准备一个包含填充视图所需的所有值的模型,然后视图按预期方式显示模型属性

任何绕过该模式的方法,如ViewBag、会话或应用程序变量,都是反模式,它们会破坏MVC方式——只要您直接从视图访问这些变量

也请参阅:如果在所有页面上都需要某些值,请考虑使用基本视图模型或部分视图。


是的,这种讨论接近于实用主义/纯粹主义。例如,如果每个用户都有一个相同的菜单,但它是从数据库中加载的,那么请确保将其存储在应用程序变量中,以便缓存,以便每个AppDomain加载一次。但仍然使用基本ViewModel或Partial渲染该菜单

我不会说将数据放入视图包是最佳做法。我认为使用视图模型是一种最佳实践

假设您想向每个视图添加对象,但不一定要通过 它需要查看模型(因为给定的对象甚至可能没有模型) 视图)

即使您没有定义视图模型,概念上也存在一个模型,即您正在向视图传递数据

如果数据位于每个视图上,则可以创建一个基础视图模型,每个模型都从该模型继承,该模型包含通用数据


您还可以使用自己的视图模型创建局部视图,然后将其应用于每个页面

通常,我在设计ViewModels时会考虑应用程序的业务或功能概念。 例如,如果要显示发票,则视图模型应包含与需要在该特定视图上显示的发票相关的所有属性。我不会为此使用ViewBags/ViewData

在ViewBag上,我通常会放置其他和“更辅助”的属性,例如,用于显示/隐藏视图某些部分的布尔值,或者用于其他一些“与业务无关”的属性

当然,有些人可能不同意这一点,并将所有内容都放在Viewmodels上,而有些人则不同意。这是一个您必须在开始时做出的决定,这样您就可以在整个应用程序的设计方式上保持一致