web-dev-qa-db-fra.com

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/...

51
Mike Scott

Le nom de l'itinéraire n'est malheureusement pas stocké dans l'itinéraire. Il est simplement 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 aussi, aucune 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,
    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;
    }
}

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

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

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

RouteData.DataTokens["RouteName"]

J'espère que cela pourra aider.

72
Nicolas Cadilhac

Vous pouvez transmettre le nom de la route à travers les valeurs de la route en utilisant la valeur par défaut du paramètre additionnel:

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 une valeur passée du contexte du contrôleur:

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

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 pas vraiment être nécessaire de faire référence au nom de la route comme ceci - ce qui, je suppose, est la raison pour laquelle MVC rend si difficile la tâche de faire ce genre de chose.

0
ajbeaven

Ceci ne pas directement répond à la question (si vous voulez être pédant); Cependant, l'objectif réel semble être d'obtenir l'URL de base d'une route, à partir du nom de la route. Donc, 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 l'itinéraire que je voulais:

/Cont/Act/

J'espère que cela t'aides.

0
logicalguy