2013-04-08 12 views
9

Ho un HttpModule e ho bisogno di sapere quale azione è in esecuzione. E ho bisogno di ottenere MethodInfo dal metodo, il nome dell'azione non è sufficiente, ho bisogno del vero metodo dal tipo.Ottenere l'esecuzione di azione in HttpModule

so come ottenere il controllo e l'azione:

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

che voglio fare:
controllerType.GetMethod(actionName)

Questa volontà ovviamente comportare AmbiguousMatchException ...

Quale firma è esecuzione? È possibile sapere?

+0

Quale versione di .NET stai utilizzando? Nella versione 4.0 e successive, il routing è incorporato in ASP.NET (non solo MVC), quindi nel modulo è possibile utilizzare HttpContext.Current.Request.RequestContext.RouteData e ottenere il valore dell'azione da lì. Per capire quale metodo è in esecuzione, dovresti utilizzare il resto dei dati del percorso, ad esempio tutto ciò che non è il controller, l'azione o l'area, poiché questi corrisponderebbero ai parametri del tuo metodo di azione. –

+0

Sto usando HttpContext.Current.Request.RequestContext.RouteData. Ma non riesco a ottenere il sovraccarico corretto per l'azione? Sai come farlo? –

+0

Vedere la mia risposta suggerita. –

risposta

0

Questo dovrebbe funzionare. Passa attraverso i dati del percorso e ottiene tutti i pezzi dei dati del percorso che non sono ben noti, cioè controller, azione e area. Questo presuppone che tu stia utilizzando la rotta predefinita. Ogni altra parte del percorso, che si trovi nell'URL o nella stringa di query, verrà mappata a un parametro del metodo. È possibile ottenere il tipo di questi valori di percorso e utilizzarli per ottenere le informazioni sul metodo specificato.

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

Ho provato, ma ho appena ricevuto 3 chiavi in ​​RouteData, controller, azione e id. E anche se l'azione ha 2 parametri, non riesco a trovarli in RouteData. –

+0

Esistono più metodi di azione con lo stesso nome che variano solo in base ai parametri? Che aspetto hanno la firma e l'URL del metodo di azione? –

+0

Esempio: 1: [AcceptVerbs (HttpVerbs.Get)] pubblici ActionResult report() 2: [AcceptVerbs (HttpVerbs.Post)] pubblico virtuale JsonResult Report (ViewModel ViewModel) –

Problemi correlati