2012-01-17 71 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