Les routes ASP.NET MVC ont des noms lorsqu’elles sont mappées:
routes.MapRoute( "Debug", // Route name -- how can I use this later???? "debug/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = ssortingng.Empty } );
Est-il possible d’obtenir le nom de la route, par exemple “Debug” dans l’exemple ci-dessus? Je voudrais y accéder dans OnActionExecuting du contrôleur pour pouvoir configurer des choses dans ViewData lors du débogage, par exemple, en préfixant une URL avec / debug / …
Le nom de l’itinéraire n’est malheureusement pas enregistré dans l’itinéraire. Il est juste utilisé en interne dans MVC en tant que clé dans une collection. Je pense que c’est quelque chose que vous pouvez toujours utiliser lors de la création de liens avec HtmlHelper.RouteLink par exemple (peut-être ailleurs, pas d’idée).
En tout cas, j’en avais besoin aussi et voici ce que j’ai fait:
public static class RouteCollectionExtensions { public static Route MapRouteWithName(this RouteCollection routes, ssortingng name, ssortingng url, object defaults, object constraints) { Route route = routes.MapRoute(name, url, defaults, constraints); route.DataTokens = new RouteValueDictionary(); route.DataTokens.Add("RouteName", name); return route; } }
Je pourrais donc enregistrer un itinéraire comme celui-ci:
routes.MapRouteWithName( "myRouteName", "{controller}/{action}/{username}", new { controller = "Home", action = "List" } );
Dans mon action Controller, je peux accéder au nom de la route avec:
RouteData.DataTokens["RouteName"]
J’espère que cela pourra aider.
Vous pouvez passer le nom de la route via des valeurs de route en utilisant la valeur par défaut du paramètre supplémentaire:
routes.MapRoute( name: "MyRoute", url: "{controller}/{action}/{id}", defaults: new { routeName = "MyRoute", controller = "Home", action = "Index", id=UrlParameter.Optional } );
Ensuite, il est possible d’obtenir la valeur du contexte du contrôleur:
ssortingng routeName = ControllerContext.RouteData.Values["routeName"].ToSsortingng();
Une solution alternative pourrait être d’utiliser des configurations de solution:
protected override OnActionExecuting() { #if DEBUG // set up stuff in the ViewData #endif // continue }
Il ne devrait jamais y avoir de besoin de faire référence au nom de la route comme cela – ce qui, je suppose, est la raison pour laquelle MVC rend la tâche si difficile.
Cela ne répond pas directement à la question (si vous voulez être pédant); Cependant, l’objective réel semble être d’obtenir l’URL de base d’un itinéraire, à partir d’un nom d’itinéraire. Alors, voici comment je l’ai fait:
Mon itinéraire a été défini dans RouteConfig.cs
comme suit:
routes.MapRoute( name: "MyRoute", url: "Cont/Act/{blabla}", defaults: new { controller = "Cont", action = "Act"} );
Et pour obtenir l’URL de base de l’itinéraire:
var myRoute = Url.RouteUrl("MyRoute", new { blabla = "blabla" }).Replace("blabla", "");
Il m’a donné l’URL de base de l’itinéraire que je voulais:
/Cont/Act/
J’espère que cela t’aides.
une autre option – utilisez MapRoute avec l’argument ssortingng [] namespaces, alors vous pouvez voir vos espaces de noms comme RouteData.DataTokens["Namespaces"]