54 votes

Comment puis-je obtenir le nom de la route dans le contrôleur dans ASP.NET MVC?

Les itinéraires ASP.NET MVC ont des noms lorsqu'ils sont mappés:

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

Existe-t-il un moyen d'obtenir le nom de la route, par exemple "Debug" dans l'exemple ci-dessus? J'aimerais y accéder dans l'exécution 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 / ...

75voto

Nicolas Cadilhac Points 2732

Le nom de la route n'est pas stocké dans la route, malheureusement. Il est seulement 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).

De toute façon, j'en avais besoin aussi, et voici ce que j'ai fait:

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

J'ai donc pu enregistrer une route comme ceci:

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

Dans mon Contrôleur de l'action, je peux accéder le nom de la route avec:

RouteData.DataTokens["RouteName"]

Espérons que cela aide.

-1voto

ajbeaven Points 2577

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

 protected override OnActionExecuting()
{
    #if DEBUG

        // set up stuff in the ViewData

    #endif

    // continue
}
 

Il ne devrait jamais être nécessaire de faire référence au nom de la route comme celui-ci - ce qui, je suppose, est la raison pour laquelle MVC rend la tâche si difficile.

-2voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X