2009-10-20 20 views
5

¿Cómo puedo obtener el nombre del controlador de una URL relativa, utilizando las rutas que he definido en Global.asax?ASP.NET-MVC. ¿Cómo obtener el nombre del controlador desde una url?

Ejemplo:

si tengo un defiend ruta así:

routes.MapRoute(
       "Default",            // Route name 
       "{language}/{controller}/{action}/{id}",     // URL with parameters 
       new { controller = "Home", action = "Index", id = "", language = "en" } 

de la cadena "~/es/productos/lista de" yo quiero tener productos (el nombre del controlador). ¿Hay algún método existente que ya lo haga?

+1

¿Dónde se va a ubicar en? –

+0

En una clase auxiliar que se extenderá UrlHelper – Gregoire

+0

https://stackoverflow.com/questions/8830052/how-do-i-get-the-controller-and-action-names-from-the-referrer-uri –

Respuesta

4

el blog de Véase Stephen Walther ASP.NET MVC Tip #13 – Unit Test Your Custom Routes

El proyecto MvcFakes tiene una antigua referencia System.Web.Abstractions. Entonces debe reemplazarlo con el nuevo y recomponer el proyecto para obtener MvcFakes.dll.

Este es mi código:

public string getControllerNameFromUrl() 
{ 
    RouteCollection rc = new RouteCollection(); 
    MvcApplication.RegisterRoutes(rc); 
    System.Web.Routing.RouteData rd = new RouteData(); 
    var context = new FakeHttpContext("\\" + HttpContext.Request.Url.AbsolutePath); 
    rd = rc.GetRouteData(context); 
    return rd.Values["action"].ToString(); 
} 

En mi código "MvcApplication" es el nombre de la clase en el Global.asax.

¡Buena suerte!

+0

Gracias, lo intentaré. – Gregoire

+0

El enlace del blog de Stephen Walther arriba, todavía funciona. Sin embargo, una vez en su sitio, el enlace de descarga falla y el enlace a la sugerencia n. ° 12 también falla, por lo que no puedo obtener una lista de la clase 'FakeHttpContext'. ¿Conoces otros lugares para obtener una funcionalidad similar? – Zarepheth

+0

Consejo # 12 está aquí: http://stephenwalther.com/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context – VeeTheSecond

1

No estoy seguro de lo que estás preguntando, así que si mi respuesta es incorrecta, es porque estoy adivinando lo que quieres.

Siempre puede agregar otra ruta a su Global.asax. Esa es a menudo la forma más fácil de tratar casos 'fuera de la norma'.

Si desea obtener una lista de productos, que va a utilizar esta ruta:

routes.MapRoute(
      "ProductList",   
      "{language}/{products}/{action}/", 
      new { controller = "Products", action = "List", language = "en" }); 

También puede sustituir los productos con la más genérica {controller} si hay más de un tipo de entidad que se va a utilizar este ruta. Debe modificarlo para sus necesidades.

Por ejemplo, para hacer de este una ruta genérica que puede utilizar para obtener una lista de todos los productos:

routes.MapRoute(
      "ProductList",   
      "{language}/{controller}/{action}/", 
      new { controller = "Products", action = "List", language = "en" }); 

Lo que esto hace es que crea una ruta (que se debe colocar siempre delante de su Default ruta) que dice: "Por lo que sea que el usuario ingrese, dame el controlador y la acción que piden". (Tal como /en/Products/List, o /en/Users/List).

Para visitar ese controlador, solo necesita navegar a lo siguiente: yoursite.com/en/products/list. También puede usar el HTMLActionLink para visitar el controlador.

<%=Html.ActionLink("Product", "List", new { controller = Products }, null) %>

estoy escribiendo esto sin mi IDE abierta, por lo que el ActionLink puede tener un error en ella.

+1

Gracias por teniendo el tiempo para responderme, pero lo que estoy buscando es una función GetRoute "inversa", es decir, desde una url (no la actual), quiero poder extraer el nombre del controlador – Gregoire

+0

@Gregor Great, eh, ¿Por qué no dijiste eso en primer lugar? –

+0

Lo siento pero he cometido un error porque creía que era lo suficientemente claro – Gregoire

6

Usted probablemente debería añadir otra ruta como George sugiere, pero si realmente sólo tiene el valor de controlador derivado de la ruta se puede hacer esto en sus métodos de acción del controlador:

var controller = (string)RouteData.Values["controller"]; 
+1

¿Cómo podría obtener el nombre del contributor de una URL arbitraria, no de RouteData? – Gregoire

+0

@Gregor? ¿Te refieres a una URL arbitraria en tu sitio o la de alguien más? Si está en su sitio, entonces él le dijo cómo. –

+1

No, porque funcionará solo para la URL actual, si no me equivoco (funciona con el contexto actual de Http) – Gregoire

Cuestiones relacionadas