asp.net - 在处理请求之前找出 Controller 的名称和操作

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

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

我想到了两种方法:

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

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

2) 我假设 MVC 在实例化正确的 Controller 之前已经为我完成了这一工作。我想知道它在哪里执行此操作,以便我可以重用它的工作。我什么时候可以获取此信息、拦截请求并在请求到达操作之前对其执行某些操作?

最佳答案

您可以创建一个 global action filter您可以在其中访问 Controller 和操作:

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 ...
    }
}

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

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

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

关于asp.net - 在处理请求之前找出 Controller 的名称和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14602059/

相关文章:

c# - 在不释放空间的情况下隐藏代码中的控件

asp.net - ASP MVC Cookie 不持久

asp.net-mvc-3 - Entity Framework 、ASP.NET 和 SQL Server CE

asp.net - 如何制作asp :GridView sortable?

asp.net - Paypal 失败通知

c# - 如何在gridview asp.net中插入单选按钮列

c# - 如何对代码覆盖率进行单元测试?

asp.net-mvc - asp.net mvc错误重定向到错误的位置

asp.net-mvc - ASP.NET MVC 3 在文章 View 中添加评论

asp.net-mvc-3 - 将 MVC3 View 中的多个值传递给 ActionMethod