想象一下,您在 ASP.Net MVC 中有一个嵌入了多个局部视图,它们独立工作并通过(子操作)View
加载自己的模型。Html.Action
现在每个单独的部分视图都需要从数据库中加载某些项目。就性能而言,将所有此类数据库调用组合在一起并使用一个查询而不是通过每个单独的子操作逐个预加载相同类型的所有项目会更有效。
例如,假设我们有以下结构:
- 索引(查看)
- 主菜单(子操作/部分视图)
- 这将加载 ID 为 1 和 2 的部分
- 主要内容(儿童动作/局部视图)
- 这将加载 ID 为 3、4 和 5 的部分
- 相关部分(儿童行动/部分视图)
- 这将加载 ID 为 6 和 7 的部分
- ...
- 主菜单(子操作/部分视图)
现在在上述场景中,上面的每个子操作将分别进行各自的数据库调用以加载其自己的模型所需的部分。
为了提高性能,我们需要一种方法,在我们执行每个动作或子动作之前,此类数据库项目请求被“注册”,然后能够一起加载所有项目。然后,当 Action 或 Child Action 需要使用此类数据库项目时,它们将已经完全预加载。
我们正在考虑使用附加到每个动作和子动作的动作过滤器,说明请求了哪些项目,但不幸的是,该OnActionExecuting
方法在每个动作被调用之前被单独调用。
我们想要类似于动作过滤器的东西,但不是在每次调用之前执行,而是在调用任何动作/子动作之前在请求的开头执行。通过这种方式,我们可以注册所有此类数据库项目需求并将它们一起加载。
类似于OnInit
Asp.Net Web 窗体中的事件,首先调用所有用户控件和控件的 OnInit,然后调用 ASP.Net Web 窗体生命周期中的其他事件。
或者,也许您可以提供与我们要求类似的不同解决方案?