2013-04-08 124 views
9

我有一個HttpModule並需要知道正在執行哪個操作。我需要從方法中獲取MethodInfo,操作名稱不夠,我需要類型中的實際方法。在HttpModule中執行操作

我知道如何讓控制器和動作:我想做

string controllerName = ...RouteData.Values["controller"].ToString(); 
string actionName = ...RouteData.Values["action"].ToString(); 


controllerType.GetMethod(actionName)

在AmbiguousMatchException當然結果這將...

哪個簽名執行?有可能知道嗎?

+0

您使用的是什麼版本的.NET?在4.0及以上版本中,路由內置於ASP.NET(不僅僅是MVC),所以在你的模塊中,你可以使用HttpContext.Current.Request.RequestContext.RouteData,並從那裏獲取行爲值。爲了弄清楚什麼方法正在執行,你可以使用其餘的路由數據,即任何不是控制器,動作或區域的數據,因爲這些數據將與你的動作方法中的參數相匹配。 – 2013-04-09 13:09:35

+0

我正在使用HttpContext.Current.Request.RequestContext.RouteData。但是我無法獲得正確的超載行爲?你知道怎麼做嗎? – 2013-04-12 08:32:08

+0

請參閱我的建議答案。 – 2013-04-15 19:03:44

回答

0

這應該工作。它通過路線數據進行循環,並獲取所有不知道的路線數據,即控制器,動作和區域。這假設你正在使用默認路由。路由的其他部分(無論是URL還是查詢字符串)都將映射到方法參數。您可以獲取這些路由值的類型並使用它們來獲取指定的方法信息。

List<Type> methodParams = new List<Type>(); 
string action = HttpContext.Current.Request.RequestContext.RouteData["action"]; 
foreach (var data in HttpContext.Current.Request.RequestContext.RouteData.Values) 
{ 
    if ((data.Key != "action") && (data.Key != "controller") && (data.Key != "area")) 
     methodParams.Add(data.Value.GetType());     
} 

Type t; //assume this is your type that implements the action method you're interested in. 
     //I'm assuming you know it somehow 

MethodInfo info = t.GetMethod(action, methodParams.ToArray()); 
+0

我已經嘗試過了,但是我只是在RouteData,控制器,操作和ID中獲得了3個鍵。儘管該動作有2個參數,但我無法在RouteData中找到它們。 – 2013-04-16 07:24:08

+0

是否有多個操作方法具有相同的名稱,只是因參數而異?你的行爲方法簽名和URL是什麼樣的? – 2013-04-16 11:24:33

+0

舉例: 1: 的[AcceptVerbs(HttpVerbs.Get) 公衆的ActionResult報告() 2: 的[AcceptVerbs(HttpVerbs.Post) 公共虛擬JsonResult報告(視圖模型視圖模型) – 2013-04-16 11:52:31