MVC 3中类似BeginRequest的过滤器?

时间:2011-02-02 20:10:51

标签: asp.net-mvc-3 global-asax action-filter

我的应用程序中有一些代码需要在每个请求上执行,在执行任何其他操作之前(甚至在验证之前)。到目前为止,我一直在我的Global.asax中使用Application_BeginRequest事件,这一切都运行良好。但是这段代码需要访问数据库,而从Global.asax执行此操作由于某种原因感觉不对。此外,我正在使用的Ninject.MVC3 nuget不会将依赖项注入我的HttpApplication ctor。

所以我决定将此代码移动到自己的全局动作过滤器中。我现在遇到的问题是无论我使用什么Order或FilterScope给出这个过滤器,我都不能先让它执行;我的授权过滤器总是胜过它。 MSDN似乎证实了这一点:

  

过滤订单

     

过滤器按以下顺序运行:

     
      
  1. 授权过滤器
  2.   
  3. 操作过滤器
  4.   
  5. 响应过滤器
  6.   
  7. 例外过滤器
  8.         

    例如,授权过滤器运行   第一个和异常过滤器最后运行。   在每个过滤器类型中,订单   value指定运行顺序。内   每个过滤器类型和顺序,范围   枚举值指定顺序   用于过滤器。

我知道我可以使用HttpModule,但感觉不是非常 MVCish ,所以我试图在走这条路线之前耗尽所有可能性,这导致了我的问题:

全局操作过滤器是否有BeginRequest等效项?

1 个答案:

答案 0 :(得分:16)

您可以在基本控制器的Initialize方法中执行此操作。

另一种可能性是注册global filter

public class MyGlobalFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // that's gonna be hit
    }
}

以及RegisterGlobalFilters的{​​{1}}事件:

Global.asax