如何从URL或路径数据中获取控制器类型和操作信息?

Rob*_*ine 11 c# asp.net asp.net-mvc asp.net-mvc-routing

在给定的情况下,如何获取将要调用的控制器操作(方法)和控制器类型System.Web.Routing.RouteData

我的情况是这样的 - 我希望能够在动作OnActionExecuting方法中执行某些动作(或不动作).

但是,我经常想知道当前的行动,而不是被称为"根"行动; 通过这个我的意思是我可能有一个名为"登录"的视图,这是我的登录页面.该视图可以包括另一个局部视图"LeftNav".当OnActionExecuting为LeftNav调用时,我希望能够确定它确实被称为Login的"root"aciton.

我意识到,通过调用RouteTable.Routes.GetRouteData(actionExecutingContext.HttpContext),我可以获得"root"请求的路由,但是如何将其转换为方法和类型信息?

到目前为止,我唯一的解决方案是:

 var routeData = RouteTable.Routes.GetRouteData(actionExecutingContext.HttpContext)
 var routeController = (string)routeData.Values["controller"]; 
 var routeAction = (string)routeData.Values["action"];
Run Code Online (Sandbox Code Playgroud)

这个问题是"routeController"是删除了"Controller"后缀的控制器名称,并且不是完全限定的; 即它是"登录",而不是"MyCode.Website.LoginController".

我宁愿得到一个实际的Type,MethodInfo如果可能的话,或者至少是一个完全合格的类型名称.

有什么想法或替代方法吗?

[ 编辑 - 这是ASP.Net MVC 1.0]

que*_*en3 5

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
     var type1 = filterContext.Controller.GetType();
     var type2 = filterContext.ActionDescriptor
                    .ControllerDescriptor.ControllerType;
  }
Run Code Online (Sandbox Code Playgroud)

好的,对不起,我错过了"根"部分.

然后,另一种方法,您可以将控制器类型保存到线程存储.伪代码:

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
     if (!Thread.LocalStorage.Contains("root_controller"))
        Thread.LocalStorage["root_controller"] = 
            filterContext.ActionDescriptor
                    .ControllerDescriptor.ControllerType;
  }
Run Code Online (Sandbox Code Playgroud)

只是一个想法.我确信C#中提供了线程本地存储.这里的关键思想是你只为第一次请求保存它,因此它总是根控制器.