在HttpModule中执行执行操作

时间:2013-04-08 10:15:55

标签: asp.net-mvc

我有一个HttpModule,需要知道正在执行哪个动作。我需要从方法中获取MethodInfo,动作名称不够,我需要从类型中获取真实的方法。

我知道如何获得控制器和动作:

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

我想这样做:
controllerType.GetMethod(actionName)

这当然会导致AmbiguousMatchException ...

正在执行哪个签名?有可能知道吗?

1 个答案:

答案 0 :(得分: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());