Как получить имя маршрута в контроллере в 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/...
Ответы
Ответ 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"]