ASP.NET MVC:对所有动作执行代码(全局OnActionExecuting?)

时间:2009-09-16 04:29:46

标签: c# asp.net-mvc

我是否可以覆盖“全局”OnActionExecuting以使所有我的MVC操作(无论控制器)在被调用时执行某些操作?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:12)

Asp.net MVC3增加了对Global Filters

的支持

来自ScottGu博客:

ASP.NET MVC支持使用称为“过滤器”的机制以声明方式应用“交叉”逻辑。您现在可以使用如下属性语法在控制器和操作方法上指定过滤器:

image

开发人员通常希望在应用程序中的所有控制器上应用一些过滤器逻辑。 ASP.NET MVC 3现在允许您指定过滤器应全局应用于应用程序中的所有控制器。您现在可以通过将其添加到GlobalFilters集合来执行此操作。现在,RegisterGlobalFilters()方法包含在默认的Global.asax类模板中,以便为此提供方便的位置(然后由Application_Start()方法调用):

image

MVC 3中的过滤器分辨率逻辑非常灵活,因此您可以配置仅在满足某些条件时有条件地应用的全局过滤器(例如:启用调试,或者请求使用特定的http动词等)。现在也可以从依赖注入(DI)容器中解析过滤器。

答案 1 :(得分:4)

不。最简单的方法是编写一个所有控制器类型子类的公共基类,然后在该基类上粘贴一个动作过滤器或覆盖它的OnActionExecuting()方法。

答案 2 :(得分:2)

创建一个实现IActionFilter和/或IResultFilter的类:

public class FilterAllActions : IActionFilter, IResultFilter
{      
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        throw new System.NotImplementedException();
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        throw new System.NotImplementedException();
    }

    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
        throw new System.NotImplementedException();
    }

    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
        throw new System.NotImplementedException();
    }
}

并在Global.asax上注册

    protected void Application_Start()
    {
        //...
        RegisterGlobalFilters(GlobalFilters.Filters);
        //...
    }

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new FilterAllActions());
    }