Wie kann ich den Routennamen im Controller in ASP.NET MVC abrufen?

ASP.NET MVC-Routen haben Namen, wenn sie zugeordnet sind:

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

Gibt es eine Möglichkeit, den Routennamen zu bekommen, zB “Debug” im obigen Beispiel? Ich möchte es in der OnActionExecuting des Controllers zugreifen, so dass ich Sachen in den ViewData beim Debuggen einrichten kann, zum Beispiel durch Voranstellen einer URL mit / debug / …

Der Routenname ist leider nicht in der Route gespeichert. Es wird nur intern in MVC als Schlüssel in einer Sammlung verwendet. Ich denke, das ist etwas, das Sie immer noch verwenden können, wenn Sie zum Beispiel Links mit HtmlHelper.RouteLink erstellen (vielleicht auch woanders, keine Ahnung).

Wie auch immer, ich brauchte das auch und hier ist was ich getan habe:

 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; } } 

So könnte ich eine Route wie folgt registrieren:

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

In meiner Controller-Aktion kann ich auf den Routennamen zugreifen mit:

 RouteData.DataTokens["RouteName"] 

Ich hoffe, das hilft.

Sie können den Routennamen über Routenwerte übergeben, indem Sie den Standardwert des zusätzlichen Parameters verwenden:

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

Dann ist es möglich, einen übergebenen Wert aus dem Controller-Kontext zu erhalten:

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

Eine alternative Lösung könnte die Verwendung von Lösungskonfigurationen sein:

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

Es sollte nicht wirklich nötig sein, den Routennamen so zu referenzieren – was MVACs Situation so schwer macht.

Dies beantwortet nicht direkt die Frage (wenn Sie pedantisch sein wollen); Das eigentliche Ziel scheint jedoch zu sein, die Basis-URL einer Route unter Angabe eines Routennamens zu erhalten. Also, so habe ich es gemacht:

Meine Route wurde in RouteConfig.cs wie RouteConfig.cs definiert:

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

Und um die Basis-URL der Route zu erhalten:

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

Es gab mir die Basis-URL der Route, die ich wollte:

 /Cont/Act/ 

Hoffe das hilft.

eine andere Option – benutze MapRoute mit string [] Namespaces Argument, dann kannst du deine Namespaces als RouteData.DataTokens["Namespaces"]