ASP.NET MVC 5 URL Routing
Convention-based Routing
Creating and Registering a Simple Route
App_Start/RouteConfig.cs
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
Global.asax.cs
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); }
Using Static URL Segments
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "public/x{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
Defining Variable-Length Routes
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}/{*catchall}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
Prioritizing Controllers by Namespaces
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}/{*catchall}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new string[] { "UrlsAndRoutes.Controllers" } ); }
Constraining a Route Using a Regular Expression
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}/{*catchall}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { controller = "^H.*" }, namespaces: new string[] { "UrlsAndRoutes.Controllers" } ); }
Constraining a Route to a Set of Specific Values
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}/{*catchall}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { controller = "^H.*", action = "^Index$|^About$"}, namespaces: new string[] { "UrlsAndRoutes.Controllers" } ); }
Constraining a Route Using HTTP Methods
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}/{*catchall}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { controller = "^H.*", action = "^Index$|^About$", httpMethod = new HttpMethodConstraint("GET") }, namespaces: new string[] { "UrlsAndRoutes.Controllers" } ); }
Using Type and Value Constraints
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}/{*catchall}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { controller = "^H.*", action = "^Index$|^About$", httpMethod = new HttpMethodConstraint("GET"), id = new RangeRouteConstraint(10,20) }, namespaces: new string[] { "UrlsAndRoutes.Controllers" } ); }
Defining a Custom Constraint
If the standard constraints are not sufficient for your needs, you can define your own custom constraints by implementing the IRouteConstraint interface.
public class UserAgentConstraint: IRouteConstraint { private string requiredUserAgent; public UserAgentConstraint(string agentParam) { requiredUserAgent = agentParam; } public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { return httpContext.Request.UserAgent != null && httpContext.Request.UserAgent.Contains(requiredUserAgent); } }
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "ChromeOnly", url: "{controller}/{action}/{id}/{*catchall}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { customConstraint = new UserAgentConstraint("chrome") } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}/{*catchall}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { controller = "^H.*", action = "^Index$|^About$", httpMethod = new HttpMethodConstraint("GET"), id = new RangeRouteConstraint(10, 20) }, namespaces: new string[] { "UrlsAndRoutes.Controllers" } ); }
Attribute Routing
This is not a recommend way to handle routing, but in case you need this feature, you can turn it on by using command: routes.MapMvcAttributeRoutes() in RouteConfig.RegisterRoutes method.