在请求服务之前找出控制器的名称和操作

时间:2013-01-30 10:43:03

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-routing

我希望拦截进入我的MVC应用程序的所有请求之后的ControllerName和Action已经解决,但是在请求被提供服务之前,即在它到达适当的操作之前。

我想到了两种方法:

1)我可以编写HttpModule来拦截每个传入的HttpRequest,读取HttpContext.Request.AbsoluteUrl(或某些此类)属性然后假设我已配置的路由将永远不会改变(这是我想要避免的假设,或者我会这样做),并推断出正在调用的控制器和动作的名称。

然而,我正在寻找一种更可靠的方式。因此,下面的(2)。

2)我假设MVC在实例化正确的控制器之前已经为我做过一次或另一次。我想知道它在哪里,所以我可以重新使用它的工作。在这一点上,我可以获取此信息,拦截请求并在其到达操作之前对其执行某些操作?

1 个答案:

答案 0 :(得分:2)

您可以创建一个global action filter,您可以在其中访问控制器和操作:

public class MyGlobalActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string controller = filterContext.RouteData.GetRequiredString("controller");
        string action = filterContext.RouteData.GetRequiredString("action");
        // do something with those variables ...
    }
}

在运行每个控制器操作之前,将调用OnActionExecuting方法,您将能够从RouteData检索您要查找的信息。

然后只需在Application_Start中注册您的全局操作过滤器:

GlobalFilters.Filters.Add(new MyGlobalActionFilter());