2

我想在 ControllerName 和 Action 被解析之后,但在请求被服务之前,即在它到达适当的操作之前,拦截进入我的 MVC 应用程序的每个请求。

我想到了两种方法:

1)我可以写一个HttpModule来拦截每个传入HttpRequest的,读取HttpContext.Request.AbsoluteUrl(或一些这样的)属性,然后假设我配置的路由永远不会改变(这是我想避免的假设,否则我会走这条路) ,并推断正在调用的控制器和操作的名称。

但是,我正在寻找一种更可靠的方法。因此下面的(2)。

2)我假设MVC在实例化正确的控制器之前已经为我做了一次或另一次。我想知道它在哪里这样做,以便我可以重新使用它的工作。在什么时候我可以获取此信息,拦截请求并在它到达操作之前对其进行处理?

4

1 回答 1

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());
于 2013-01-30T10:47:59.400 回答