Как я могу получить имя маршрута в контроллере в ASP.NET MVC?

Маршруты 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 / ...

12.12.2008 16:15:32
6 ОТВЕТОВ
РЕШЕНИЕ

Название маршрута не сохраняется в маршруте, к сожалению. Он просто используется внутри 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" }
    );

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

RouteData.DataTokens["RouteName"]

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

74
13.12.2008 02:05:35
Классный обходной путь, хотя кажется, что MVC не дает доступа к нему. Вы правы - вы можете создать маршрутную ссылку, указав имя, чтобы оно где-то хранилось :-)
Mike Scott 12.12.2008 23:45:16
Это не цель названия маршрута в первую очередь. Имя предназначено для предоставления индекса при создании URL-адреса с использованием маршрутизации, который позволяет указать, какой маршрут использовать. DataTokens - действительно правильный способ сделать это. Например, предположим, у вас есть несколько маршрутов «Отладка». Вы не могли использовать имя для этого в любом случае. Но вы всегда можете создать свои собственные токены данных. Маршрутизация игнорирует токены данных, но передает их, чтобы ваш код мог интерпретировать их значение.
Haacked 24.10.2010 23:46:03
тем не менее это упущение по двум причинам: во-первых, люди, по-видимому, считают его полезным, а во-вторых, почему MapRoute принимает имя в качестве аргумента, но при построении нового маршрута с конструктором в нем нет аргумента Name.
mare 15.11.2010 13:27:48
Вот еще один очень похожий подход haacked.com/archive/2010/11/28/…
GibboK 10.08.2011 10:49:13
@mare Когда инфраструктура не включает в себя все возможные функции, которые кто-либо может захотеть, это не означает «надзор». И твоя вторая причина не имеет никакого смысла. Это все равно что сказать: «Почему Dictionary<string, string>.Add()принимают keyв качестве аргумента, но при построении новой строки с конструктором в ней нет keyаргумента?» Название маршрута является идентификатором маршрута. Это не свойство маршрута.
JLRishe 31.07.2014 06:50:34

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

-2
20.11.2012 20:49:31

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

protected override OnActionExecuting()
{
    #if DEBUG

        // set up stuff in the ViewData

    #endif

    // continue
}

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

-1
20.11.2012 21:40:12

Это не дает прямого ответа на вопрос (если вы хотите быть педантичным); однако реальная цель, как представляется, состоит в том, чтобы получить базовый 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
28.07.2016 11:37:13

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

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();
1
12.05.2018 04:25:58

Если используется стандартная настройка MapRoute, как показано ниже:

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

... это будет работать в представлении ...

var routeName = Url.RequestContext.RouteData.Values["action"].ToString();
2
6.09.2019 23:10:07