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 } );
有没有办法获得路线名称,例如上面例子中的“Debug”?我想在控制器的OnActionExecuting中访问它,这样我就可以在调试时在ViewData中设置东西,例如,在URL前加上/ debug /...
答案 0 :(得分:74)
遗憾的是,路线名称未存储在路线中。它仅在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"]
希望有所帮助。
答案 1 :(得分: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();
答案 2 :(得分:1)
您可以使用附加参数的默认值传递路径名称:
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();
答案 3 :(得分:0)
另一种解决方案可能是使用解决方案配置:
protected override OnActionExecuting()
{
#if DEBUG
// set up stuff in the ViewData
#endif
// continue
}
实际上不应该像这样引用路由名称 - 我想这就是为什么MVC会让这种事情变得如此困难。
答案 4 :(得分:0)
这不直接回答问题(如果你想迂腐);但是,真正的目标似乎是在给定路由名称的情况下获取路由的基本URL。所以,这就是我做到的:
我的路线在RouteConfig.cs
中定义为:
routes.MapRoute(
name: "MyRoute",
url: "Cont/Act/{blabla}",
defaults: new { controller = "Cont", action = "Act"}
);
获取路线的基本网址:
var myRoute = Url.RouteUrl("MyRoute", new { blabla = "blabla" }).Replace("blabla", "");
它为我提供了我想要的路由基本网址:
/Cont/Act/
希望这有帮助。
答案 5 :(得分:-1)
另一个选项 - 使用MapRoute和string [] namespaces参数,然后你可以看到你的命名空间为RouteData.DataTokens["Namespaces"]