Sono praticamente nuovo in StackOverflow quindi ti prego di perdonare qualsiasi segno della mia ignoranza. :)ASP.NET MVC C# Ottieni controller e nome dell'azione nella classe
Ho un problema un po 'minore con un'applicazione MVC in Visual Studio 2010 (Controller scritti in C#). Voglio creare un metodo che generi una cronologia azioni dell'applicazione e per questo scopo voglio ottenere il nome del controller e l'azione che vengono utilizzati ogni volta. Sfortunatamente manca sempre la prima lettera della stringa che contiene il nome del mio controller. Ho usato questo codice:
string url = HttpContext.Current.Request.RawUrl;
RouteData route = RouteTable.Routes.GetRouteData(new OwnedContext(url));
var values = route.Values;
string controllerName = values["controller"].ToString();
string actionName = values["action"].ToString();
Dove OwnedContext è definita in questo modo:
private class OwnedContext : HttpContextBase
{
private readonly HttpRequestBase mockHttpRequestBase;
public OwnedContext(string appRelativeUrl)
{
this.mockHttpRequestBase = new OwnedRequest(appRelativeUrl);
}
public override HttpRequestBase Request
{
get { return mockHttpRequestBase; }
}
}
Il nome dell'azione viene memorizzato in modo corretto, ma quando il debug di questo codice vedo che la stringa NomeControllore contiene il nome del controller ma manca sempre la prima lettera (maiuscola), anche se la stringa dell'URL contiene un valore con questo modello:/controller/azione.
Apprezzerò qualsiasi suggerimento, esempi di codice o una spiegazione del perché questo accada. Se la mia descrizione non è accurata fammelo sapere, la migliorerò.
Grazie in anticipo :)
EDIT: soluzione trovata:
trovato il problema (o quasi): C'era qualcosa di sbagliato con OwnedContext (definito nella mia domanda iniziale). In un primo momento ho usato RouteValueDictionary come HarHaHu suggerito, ma il problema originale persistito, fino a quando ho messo HttpContext come parametro di GetRouteData:
string url = HttpContext.Current.Request.RawUrl;
RouteData route = RouteTable.Routes.GetRouteData(httpContext);
UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContext, route));
var routeValueDictionary = urlHelper.RequestContext.RouteData.Values;
string controllerName = routeValueDictionary["controller"].ToString();
string actionName = routeValueDictionary["action"].ToString();
Dove HttpContext ha un getter personalizzato:
public new HttpContextBase httpContext
{
get
{
HttpContextWrapper context =
new HttpContextWrapper(System.Web.HttpContext.Current);
return (HttpContextBase)context;
}
}
In questo modo ho omesso l'OwnedContext e finalmente ottenuto il nome completo del mio controllore (ad esempio: mobili e non mobili).
Grazie per i suggerimenti. :) Spero che questo aiuti qualcuno. In bocca al lupo!
Qualche possibilità di pubblicare le definizioni del percorso da global.asax? Evidentemente qualcosa viene tradotto male dall'URL del percorso. – Dave
my global.asax contiene le route predefinite generate con il modello di applicazione MVC3 –