How can I get the route name in controller in ASP.NET MVC?
Solution 1
The route name is not stored in the route unfortunately. It is just used internally in MVC as a key in a collection. I think this is something you can still use when creating links with HtmlHelper.RouteLink for example (maybe somewhere else too, no idea).
Anyway, I needed that too and here is what I did:
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;
}
}
So I could register a route like this:
routes.MapRouteWithName(
"myRouteName",
"{controller}/{action}/{username}",
new { controller = "Home", action = "List" }
);
In my Controller action, I can access the route name with:
RouteData.DataTokens["RouteName"]
Hope that helps.
Solution 2
If using the standard MapRoute setting like below:
routes.MapRoute( name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
...this will work in the view...
var routeName = Url.RequestContext.RouteData.Values["action"].ToString();
Solution 3
You could pass route name through route values using default value of additional parameter:
routes.MapRoute(
name: "MyRoute",
url: "{controller}/{action}/{id}",
defaults: new { routeName = "MyRoute", controller = "Home", action = "Index", id=UrlParameter.Optional }
);
Then, it is possible to get passed value from controller context:
string routeName = ControllerContext.RouteData.Values["routeName"].ToString();
Mike Scott
Software development consultant, ex Delphi TeamB, now C# and .Net enthusiast.
Updated on July 09, 2022Comments
-
Mike Scott almost 2 years
ASP.NET MVC routes have names when mapped:
routes.MapRoute( "Debug", // Route name -- how can I use this later???? "debug/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = string.Empty } );
Is there a way to get the route name, e.g. "Debug" in the above example? I'd like to access it in the controller's OnActionExecuting so that I can set up stuff in the ViewData when debugging, for example, by prefixing a URL with /debug/...
-
Mike Scott over 15 yearsCool workaround, though it seems like an oversight that MVC doesn't give access to it. You're right - you can create a route link by specifying the name, so it is stored somewhere :-)
-
edoloughlin over 13 yearsThis isn't the purpose of the route name in the first place. The name is meant to provide an index when generating an URL using Routing that allows you to specify which route to use. DataTokens is really the right way to do that. For example, suppose you have multiple "Debug" routes. You couldn't use name for it anyways. But you can always create your own data tokens. Routing ignores data tokens but passes them along so your code can do the interpretation of what they mean.
-
mare over 13 yearsstill it is an oversight for two reasons: first, people apparently find it useful and second, why does the MapRoute take the name as argument but when constructing a new route with a constructor there is no Name argument in it.
-
GibboK over 12 yearsHere another very similar approach haacked.com/archive/2010/11/28/…
-
JLRishe over 9 years@mare When a framework doesn't include every possible feature that anyone could possibly want, that doesn't equate to an "oversight." And your second reason doesn't make any sense. That's like saying "Why does
Dictionary<string, string>.Add()
takekey
as an argument, but when constructing a new string with a constructor there is nokey
argument in it?" The route name is an identifier for the route. It's not a property of the route.