it-swarm.com.de

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

ASP.NET-MVC-Routen haben bei der Zuordnung Namen:

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 erhalten, z. "Debug" im obigen Beispiel? Ich möchte darauf in der OnActionExecuting-Steuerung des Controllers zugreifen, damit ich beim Debuggen Sachen in ViewData einrichten kann, indem ich zum Beispiel/URL eine URL mit einem Präfix voranstelle.

51
Mike Scott

Der Routenname wird leider nicht in der Route gespeichert. Es wird nur intern in MVC als Schlüssel in einer Sammlung verwendet. Ich denke, das ist etwas, was Sie zum Beispiel beim Erstellen von Links mit HtmlHelper.RouteLink verwenden können (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"]

Hoffentlich hilft das.

72

Sie können den Routennamen durch Routenwerte übergeben, indem Sie den Standardwert zusätzlicher Parameter 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 Steuerungskontext zu erhalten:

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

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 nie wirklich nötig sein, den Routennamen wie folgt zu referenzieren. Dies ist vermutlich der Grund, warum MVC es so schwierig macht, solche Dinge zu tun.

0
ajbeaven

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

Meine Route wurde in RouteConfig.cs definiert als:

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.

0
logicalguy