2008-12-12 7 views
46

routes ASP.NET MVC ont des noms lors de la projection:Comment puis-je obtenir le nom de la route dans le contrôleur dans 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 }); 

est-il un moyen d'obtenir le nom de la route, par exemple "Debug" dans l'exemple ci-dessus? Je souhaite y accéder dans OnActionExecuting du contrôleur afin de pouvoir configurer des éléments dans ViewData lors du débogage, par exemple, en préfixant une URL avec/debug/...

Répondre

66

Le nom de la route n'est pas stocké dans le route malheureusement. Il est juste utilisé en interne dans MVC comme une 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 aussi, aucune idée).

Quoi qu'il en soit, il me fallait aussi, et voici ce que je faisais:

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

donc je pourrais enregistrer un itinéraire comme celui-ci:

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

Dans mon action du contrôleur, je peux accéder à la route nom avec:

RouteData.DataTokens["RouteName"] 

Espérons que ça aide.

+4

Cool solution de contournement, bien qu'il semble être un oubli que MVC ne donne pas accès à elle. Vous avez raison - vous pouvez créer un lien d'itinéraire en spécifiant le nom, donc il est stocké quelque part :-) –

+3

Ce n'est pas le but du nom de l'itinéraire en premier lieu. Le nom est destiné à fournir un index lors de la génération d'une URL à l'aide du routage qui vous permet de spécifier la route à utiliser. DataTokens est vraiment la bonne façon de le faire. Par exemple, supposons que vous ayez plusieurs routes "Debug". Vous ne pouvez pas utiliser de nom de toute façon. Mais vous pouvez toujours créer vos propres jetons de données. Le routage ignore les jetons de données mais les transmet pour que votre code puisse interpréter ce qu'ils signifient. – Haacked

+0

encore est un oubli pour deux raisons: d'abord, les gens le trouvent apparemment utile et deuxièmement, pourquoi MapRoute prend le nom comme argument, mais lors de la construction d'une nouvelle route avec un constructeur, il n'y a pas d'argument Name. – mare

-1

une autre option - utiliser MapRoute avec string [] argument namespaces, alors vous pouvez voir vos espaces de noms RouteData.DataTokens["Namespaces"]

0

Une autre solution pourrait consister à utiliser des configurations de solution:

protected override OnActionExecuting() 
{ 
    #if DEBUG 

     // set up stuff in the ViewData 

    #endif 

    // continue 
} 

Il ne devrait pas vraiment jamais besoin de référencer le nom de l'itinéraire comme ceci - ce qui est la raison pour laquelle MVC le rend si difficile à faire ce genre de chose.

0

Cela ne directement répondre à la question (si vous voulez être pédant); Cependant, le véritable objectif semble être d'obtenir l'URL de base d'une route, en donnant un nom de route. Alors, voici comment je l'ai fait:

Mon itinéraire a été défini dans RouteConfig.cs comme:

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

Et pour obtenir l'URL de base de la route:

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

Il m'a donné l'URL de base de la route que je voulais:

/Cont/Act/ 

Espérons que cela aide.

Questions connexes