2012-01-17 62 views
0

有没有办法从Global.asax中访问当前正在执行的控制器?从Global.asax中的委托中访问ControllerContext

我想用类似的语法来设计一个API来:

MyClass.RegisterComponents().When(IController => /* Some condition */) 

虽然我这个代码移到一个地方,控制器处于背景下,我想保持它集中和便携。

到目前为止,我一直无法获得控制器。有任何想法吗?

我已经考虑过创建一个基本控制器,并从这个基类扩展所有的控制器,但是,我想使这个库可以通过NuGet安装。出于这个原因,我无法采取这种做法。

+0

你不能创建一个'BaseController'并从中继承你的控制器。大部分的交互可以被截取。 – Eranga 2012-01-17 02:00:43

+0

你想在哪个Global.asax中做这件事?有一些事件甚至没有可用的HttpContext。例如,如果你运行在集成模式下,Application_Start内部没有HttpContext,我们甚至不能谈论控制器和控制器上下文。 – 2012-01-17 06:57:33

+0

这是用于应用程序启动。 – 2012-01-17 11:52:21

回答

0

我找到了解决方案。不是很好,但它解决了我的问题。

我在David Ebbo的博客(http://blog.davidebbo.com/2011/02/register-your-http-modules-at-runtime.html)上找到使用程序集启动方法注册全局IActionFilter。

全局操作过滤器只将操作上下文存储在当前HttpContext.Items []集合中,该集合是每个请求集合。

public class GlobalActionFilter : System.Web.Mvc.IActionFilter { 

     internal static readonly object ActionExecutedFilterKey = 
      "__MvcResourceLoaderActionExecutedContext"; 

     internal static readonly object ActionExecutingFilterKey = 
      "__MvcResourceLoaderActionExecutingContext"; 

     static MvcResourceLoaderGlobalFilter __instance = 
      new MvcResourceLoaderGlobalFilter(); 

     MvcResourceLoaderGlobalFilter() { } 

     public void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext) { 
      System.Web.HttpContext.Current.Items[ActionExecutedFilterKey] = 
       filterContext; 
     } 

     public void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) { 
      System.Web.HttpContext.Current.Items[ActionExecutingFilterKey] = 
       filterContext; 
     } 

     public static void RegisterGlobalFilter() { 

      if (!System.Web.Mvc.GlobalFilters.Filters.Contains(__instance)) 
       System.Web.Mvc.GlobalFilters.Filters.Add(__instance); 
     } 
    } 

我可以随时访问上下文。

0

您可以在global.asmx文件中执行以下操作。

private void Application_BeginRequest(object sender, EventArgs e) 
    { 
     string controllerName = Request.RequestContext.RouteData.Values.Where(p => p.Key =="controller").FirstOrDefault(p => p.Key); 

    } 
+0

这只会给我控制器名称,而不是上下文。 – 2012-01-17 03:42:21

+0

对不起,我没有注意你的问题标题。这应该有所帮助:http://forums.asp.net/t/1505777.aspx/1 – 2012-01-17 04:51:03