How can I get the route name in controller in ASP.NET MVC?

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.


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

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