Как я могу получить имя маршрута в контроллере в ASP.NET MVC? - PullRequest
52 голосов
/ 12 декабря 2008

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

Есть ли способ получить название маршрута, например, «Отладка» в приведенном выше примере? Я хотел бы получить доступ к нему в OnActionExecuting контроллера, чтобы я мог настроить вещи в ViewData при отладке, например, с помощью префикса URL с /debug/...

Ответы [ 5 ]

74 голосов
/ 12 декабря 2008

К сожалению, название маршрута не сохраняется в маршруте. Он просто используется внутри MVC как ключ в коллекции. Я думаю, что это то, что вы все еще можете использовать при создании ссылок, например, с помощью HtmlHelper.RouteLink (возможно, где-то еще, не знаю).

В любом случае, мне это тоже нужно, и вот что я сделал:

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

Чтобы я мог зарегистрировать маршрут, подобный этому:

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

В моем действии контроллера я могу получить доступ к имени маршрута с помощью:

RouteData.DataTokens["RouteName"]

Надеюсь, это поможет.

1 голос
/ 12 мая 2018

Вы можете передать имя маршрута через значения маршрута, используя значение дополнительного параметра по умолчанию:

routes.MapRoute(
    name: "MyRoute",
    url: "{controller}/{action}/{id}",
    defaults: new { routeName = "MyRoute", controller = "Home", action = "Index", id=UrlParameter.Optional }
);

Затем можно получить переданное значение из контекста контроллера:

string routeName = ControllerContext.RouteData.Values["routeName"].ToString();
0 голосов
/ 28 июля 2016

Это не напрямую ответ на вопрос (если вы хотите быть педантичным); однако реальная цель, как представляется, состоит в том, чтобы получить базовый URL-адрес маршрута с учетом имени маршрута. Итак, вот как я это сделал:

Мой маршрут был определен в RouteConfig.cs как:

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

И чтобы получить базовый URL-адрес маршрута:

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

Он дал мне базовый URL маршрута, который я хотел:

/Cont/Act/

Надеюсь, это поможет.

0 голосов
/ 21 ноября 2012

Альтернативным решением может быть использование конфигураций решения:

protected override OnActionExecuting()
{
    #if DEBUG

        // set up stuff in the ViewData

    #endif

    // continue
}

На самом деле никогда не должно быть необходимости ссылаться на название маршрута, как это, - я полагаю, именно поэтому MVC так затрудняет подобные вещи.

0 голосов
/ 31 мая 2011

другой вариант - используйте MapRoute с аргументом пространства имен string [], тогда вы можете видеть ваши пространства имен как RouteData.DataTokens["Namespaces"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...