Come posso ottenere l'azione del controller (metodo) e il tipo di controller che verrà chiamato, dato lo System.Web.Routing.RouteData
?Come posso ottenere il tipo di controller e le informazioni sull'azione da un url o dai dati del percorso?
Il mio scenario è questo: voglio essere in grado di eseguire determinate azioni (o meno) nel metodo OnActionExecuting
per un'azione.
Tuttavia, spesso desidero non conoscere l'azione corrente, ma l'azione "root" viene chiamata; con questo intendo che potrei avere una vista chiamata "Login", che è la mia pagina di accesso. Questa vista può includere un'altra vista parziale "LeftNav". Quando si chiama OnActionExecuting
per LeftNav, voglio essere in grado di determinare che è realmente chiamato per l'aciton "root" di Login.
Mi rendo conto che chiamando il numero RouteTable.Routes.GetRouteData(actionExecutingContext.HttpContext)
, posso ottenere il percorso per la richiesta "root", ma come trasformarlo nel metodo e digitare informazioni?
L'unica soluzione che ho finora, è qualcosa di simile:
var routeData = RouteTable.Routes.GetRouteData(actionExecutingContext.HttpContext)
var routeController = (string)routeData.Values["controller"];
var routeAction = (string)routeData.Values["action"];
Il problema di questo è che "routeController" è il nome del controller con il suffisso "Controller" rimosso, e non è completo; cioè è "Login", piuttosto che "MyCode.Website.LoginController".
Preferisco di gran lunga ottenere un effettivo Type
e MethodInfo
se possibile, o almeno un nome di tipo completo.
Qualche idea o approccio alternativo?
[EDIT - questo è ASP.Net MVC 1.0]
Sfortunatamente, questo non funzionerà poiché restituisce il tipo di azione * current * del controller, non l'azione del controller "root" nell'esempio che ho dato. Il motivo per cui chiamo GetRouteData (actionExecutingContext.HttpContext) è perché questo mi fornisce correttamente il percorso per la "root", ma non posso quindi tradurlo nel tipo e nel metodo del controller. –
Questo è un suggerimento molto interessante - grazie a queen3 –
Non utilizzare lo storage ThreadLocal da un'applicazione ASP.NET. Le richieste ASP.NET possono passare da un thread all'altro, quindi l'archiviazione ThreadLocal può scomparire quando non lo si aspetta. Utilizzare invece HttpContext.Items se è necessario archiviare le informazioni che rimangono invariate solo per la richiesta corrente. – Levi