2013-04-08 18 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を使用してそこからアクション値を取得できます。どのメソッドが実行されているか把握するには、アクションメソッドのパラメータと一致する残りのルートデータ、つまりコントローラ、アクション、エリア以外のものを使用します。 –

+0

私はHttpContext.Current.Request.RequestContext.RouteDataを使用しています。しかし、私はアクションのための適切なオーバーロードを取得することはできません?あなたはそれをする方法を知っていますか? –

+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()); 
+0

私はそれを試しましたが、私はRouteData、コントローラ、アクションとIDで3つのキーを取得します。アクションには2つのパラメータがありますが、RouteDataでそれらのパラメータを見つけることはできません。 –

+0

同じ名前の複数のアクションメソッドがパラメータによって異なるだけですか?アクションメソッドのシグネチャとURLはどのように見えるのですか? –

+0

例: 1: [AcceptVerbs(HttpVerbs.Get)] 公共のActionResult報告書() 2: [AcceptVerbs(HttpVerbs.Post)] パブリック仮想化するJsonResultレポート(ViewModelにViewModelに) –

関連する問題