2012-03-05 25 views
5

Soy bastante nuevo en StackOverflow así que por favor perdone cualquier señal de mi ignorancia. :)ASP.NET MVC C# Obtener el nombre de la controladora y la acción en la clase

Tengo un problema menor con una aplicación MVC en Visual Studio 2010 (Controladores escritos en C#). Quiero crear un método que genere un historial de acciones de la aplicación y para ese propósito quiero obtener el nombre del controlador y la acción que se utilizan cada vez. Lamentablemente, la primera letra de la cadena que contiene mi nombre de controlador siempre falta. He utilizado este código:

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

Dónde OwnedContext se define así:

private class OwnedContext : HttpContextBase 
    { 
     private readonly HttpRequestBase mockHttpRequestBase; 

     public OwnedContext(string appRelativeUrl) 
     { 
      this.mockHttpRequestBase = new OwnedRequest(appRelativeUrl); 
     } 

     public override HttpRequestBase Request 
     { 
      get { return mockHttpRequestBase; } 
     } 
    } 

El nombre de la acción se almacena correctamente, pero cuando puedo depurar el código que veo que la cadena controllerName contiene el nombre de la controlador, pero la primera letra (Capital) siempre falta, aunque la cadena url tiene un valor con este patrón:/controller/action.

Agradeceré cualquier puntero, ejemplos de código o una explicación de por qué sucede esto. Si mi descripción no es precisa, hágamelo saber, lo mejoraré.

Gracias de antemano :)

EDIT: solución encontrada:

encontrado el problema (tipo de): Había algo mal con OwnedContext (definido en mi pregunta original). Al principio utilicé RouteValueDictionary como se sugiere HarHaHu pero el problema original persistió, hasta que me puse HttpContext como parámetro de 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(); 

Dónde HttpContext tiene un captador de encargo:

public new HttpContextBase httpContext 
    { 
     get 
     { 
      HttpContextWrapper context = 
       new HttpContextWrapper(System.Web.HttpContext.Current); 
      return (HttpContextBase)context; 
     } 
    } 

De esta manera he omitido la OwnedContext y finalmente obtuve el nombre completo de mi controlador (por ejemplo: muebles y no muebles).

Gracias por los consejos. :) Espero que esto ayude a alguien. ¡Buena suerte!

+0

¿Alguna posibilidad de publicar sus definiciones de ruta desde global.asax? Evidentemente, algo está siendo mal traducido de la URL de la ruta. – Dave

+0

mi global.asax contenía las rutas predeterminadas generadas con la plantilla de la aplicación MVC3 –

Respuesta

4
var routeValueDictionary = urlHelper.RequestContext.RouteData.Values; 

uso de esto con su contexto personalizado.

Cuestiones relacionadas