2013-04-08 100 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