2008-12-12 17 views
46

rutas ASP.NET MVC tienen nombres cuando mapeado:¿Cómo puedo obtener el nombre de la ruta en el controlador en ASP.NET MVC?

routes.MapRoute(
    "Debug", // Route name -- how can I use this later???? 
    "debug/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = string.Empty }); 

¿Hay una manera de obtener el nombre de la ruta, por ejemplo, "Depurar" en el ejemplo anterior? Me gustaría acceder a él en OnActionExecuting del controlador para poder configurar cosas en ViewData al depurar, por ejemplo, prefijando una URL con/debug/...

Respuesta

66

El nombre de la ruta no se almacena en ruta desafortunadamente Se usa internamente en MVC como clave en una colección. Creo que esto es algo que aún puedes usar cuando creas enlaces con HtmlHelper.RouteLink por ejemplo (quizás en otro lugar también, ni idea).

De todos modos, necesitaba que también, y esto es lo que hice:

public static class RouteCollectionExtensions 
{ 
    public static Route MapRouteWithName(this RouteCollection routes, 
    string name, string url, object defaults, object constraints) 
    { 
     Route route = routes.MapRoute(name, url, defaults, constraints); 
     route.DataTokens = new RouteValueDictionary(); 
     route.DataTokens.Add("RouteName", name); 

     return route; 
    } 
} 

por lo que podría registrar una ruta como esta:

routes.MapRouteWithName(
    "myRouteName", 
    "{controller}/{action}/{username}", 
    new { controller = "Home", action = "List" } 
    ); 

En mi acción del controlador, puedo acceder a la ruta nombre con:

RouteData.DataTokens["RouteName"] 

Espero que ayude.

+4

Solución fresca, aunque parece una supervisión que MVC no le da acceso. Tiene razón: puede crear un enlace de ruta especificando el nombre, por lo que se almacena en algún lugar :-) –

+3

Este no es el propósito del nombre de la ruta en primer lugar. El nombre está destinado a proporcionar un índice al generar una URL usando enrutamiento que le permite especificar qué ruta usar. DataTokens es realmente la forma correcta de hacerlo. Por ejemplo, supongamos que tiene múltiples rutas "Debug". No podría usar el nombre para eso de todos modos. Pero siempre puedes crear tus propios tokens de datos. El enrutamiento ignora los tokens de datos pero los transfiere para que tu código pueda interpretar su significado. – Haacked

+0

todavía es un descuido por dos razones: primero, las personas aparentemente lo encuentran útil y segundo, ¿por qué MapRoute toma el nombre como argumento pero al construir una nueva ruta con un constructor no hay ningún argumento de nombre en él? – mare

-1

otra opción - MapRoute usar con una cuerda [] espacios de nombres argumento, entonces se puede ver los espacios de nombres como RouteData.DataTokens["Namespaces"]

0

Una solución alternativa podría ser el uso de configuraciones de solución:

protected override OnActionExecuting() 
{ 
    #if DEBUG 

     // set up stuff in the ViewData 

    #endif 

    // continue 
} 

no debería realmente siempre habrá una necesidad de referenciar el nombre de la ruta de esta manera, que supongo que es la razón por la cual MVC hace que sea tan difícil hacer este tipo de cosas.

0

Esto no directamente responde la pregunta (si quieres ser pedante); sin embargo, el verdadero objetivo parece ser obtener la URL base de una ruta, dado el nombre de la ruta. Por lo tanto, esto es cómo lo hice:

Mi ruta se define en RouteConfig.cs como:

routes.MapRoute(
      name: "MyRoute", 
      url: "Cont/Act/{blabla}", 
      defaults: new { controller = "Cont", action = "Act"} 
     ); 

Y para obtener la URL base del recorrido:

var myRoute = Url.RouteUrl("MyRoute", new { blabla = "blabla" }).Replace("blabla", ""); 

Me dio URL base de la ruta que yo quería:

/Cont/Act/ 

Espero que esto ayude.

Cuestiones relacionadas