Подтвердить что ты не робот

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

Маршруты MVC ASP.NET имеют имена при отображении:

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

4b9b3361

Ответ 1

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

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

Ответ 2

Если используется стандартная настройка 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();

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

protected override OnActionExecuting()
{
    #if DEBUG

        // set up stuff in the ViewData

    #endif

    // continue
}

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

Ответ 6

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