我希望拦截进入我的MVC应用程序的所有请求之后的ControllerName和Action已经解决,但是在请求被提供服务之前,即在它到达适当的操作之前。
我想到了两种方法:
1)我可以编写HttpModule
来拦截每个传入的HttpRequest
,读取HttpContext.Request.AbsoluteUrl
(或某些此类)属性然后假设我已配置的路由将永远不会改变(这是我想要避免的假设,或者我会这样做),并推断出正在调用的控制器和动作的名称。
然而,我正在寻找一种更可靠的方式。因此,下面的(2)。
2)我假设MVC在实例化正确的控制器之前已经为我做过一次或另一次。我想知道它在哪里,所以我可以重新使用它的工作。在这一点上,我可以获取此信息,拦截请求并在其到达操作之前对其执行某些操作?
答案 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());