¿Cómo puedo obtener el nombre de la ruta en el controlador en ASP.NET MVC?

Las rutas ASP.NET MVC tienen nombres cuando se asignan:

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

¿Hay alguna 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 / …

El nombre de la ruta no está almacenado en la ruta, lamentablemente. 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, yo también necesitaba eso 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; } } 

Entonces puedo registrar una ruta como esta:

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

En mi acción de controlador, puedo acceder al nombre de la ruta con:

 RouteData.DataTokens["RouteName"] 

Espero que ayude.

Puede pasar el nombre de la ruta a través de valores de ruta usando el valor predeterminado de parámetro adicional:

 routes.MapRoute( name: "MyRoute", url: "{controller}/{action}/{id}", defaults: new { routeName = "MyRoute", controller = "Home", action = "Index", id=UrlParameter.Optional } ); 

Entonces, es posible pasar el valor desde el contexto del controlador:

 string routeName = ControllerContext.RouteData.Values["routeName"].ToString(); 

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

 protected override OnActionExecuting() { #if DEBUG // set up stuff in the ViewData #endif // continue } 

Realmente no debería haber necesidad de hacer referencia al nombre de la ruta como este, lo que supongo que es la razón por la cual MVC hace que sea tan difícil hacer este tipo de cosas.

Esto no responde directamente la pregunta (si quieres ser pedante); sin embargo, el verdadero objective parece ser obtener la URL base de una ruta, dado el nombre de la ruta. Entonces, así es como lo hice:

Mi ruta se definió en RouteConfig.cs como:

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

Y para obtener la URL base de la ruta:

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

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

 /Cont/Act/ 

Espero que esto ayude.

otra opción: use MapRoute con argumento de espacios de nombres de cadena [], luego puede ver sus espacios de nombres como RouteData.DataTokens["Namespaces"]