【问题标题】:Find out the name of the controller and action before the request is serviced在为请求提供服务之前找出控制器的名称和操作
【发布时间】:2013-01-14 03:41:49
【问题描述】:

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

我想到了两种方法:

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

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

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

【问题讨论】:

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


【解决方案1】:

您可以创建一个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());

【讨论】:

  • 哦,谢谢!我不知道我从来没有想过这样做。我已经为其他东西创建了全局操作过滤器(覆盖了自定义 AuthroizeFilter 并使其成为全局过滤器,有一个用于压缩等)。非常感谢。
  • 5 分钟,它说,在我将您的答案标记为正确之前。再次非常感谢您。 :-)
猜你喜欢
  • 2015-01-14
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多