05
DecUnderstanding Attribute Routing in ASP.NET MVC
ASP.NET MVC5 and WEB API 2 supports a new type of routing, called attribute routing. In this routing, attributes are used to define routes. Attribute routing provides you more control over the URIs by defining routes directly on actions and controllers in your ASP.NET MVC application and WEB API. To know about convention-based routing refer Routing in Asp.Net MVC with example.
Defining Attribute Routing in ASP.NET MVC
Controller level attribute routing
You can define routes at controller level which apply to all actions within the controller unless a specific route is added to an action.
[RoutePrefix("MyHome")] [Route("{action=index}")] //default action public class HomeController : Controller { //new route: /MyHome/Index public ActionResult Index() { return View(); } //new route: /MyHome/About public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } //new route: /MyHome/Contact public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } }
Action level attribute routing
You can define routes at action level which apply to a specific action with in the controller.
public class HomeController : Controller { [Route("users/{id:int:min(100)}")] //route: /users/100 public ActionResult Index(int id) { //TO DO: return View(); } [Route("users/about")] //route" /users/about public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } //route: /Home/Contact public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } }
Note
Attribute routing should configure before the convention-based routing.
When you combine attribute routing with convention-based routing, actions which do not have Route attribute for defining attribute-based routing will work according to convention-based routing. In above example Contact action will work according to convention-based routing.
When you have only attribute routing, actions which do not have Route attribute for defining attribute-based routing will not be the part of attribute routing. In this way they can’t be access from outside as a URI.
When to use Attribute Routing
The convention-based routing is complex to support certain URI patterns that are common in RESTful APIs. But by using attribute routing you can define these URI patterns very easily.
For example, resources often contain child resources like Clients have orders, movies have actors, books have authors and so on. It’s natural to create URIs that reflects these relations like as: /clients/1/orders
This type of URI is difficult to create using convention-based routing. Although it can be done, the results don’t scale well if you have many controllers or resource types.
With attribute routing, it’s pretty much easy to define a route for this URI. You simply add an attribute to the controller action as:
[Route("clients/{clientId}/orders")] public IEnumerableGetOrdersByClient(int clientId) { //TO DO }
Enabling Attribute Routing in ASP.NET MVC
Enabling attribute routing in your ASP.NET MVC5 application is simple, just add a call to routes.MapMvcAttributeRoutes() method with in RegisterRoutes() method of RouteConfig.cs file.
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //enabling attribute routing routes.MapMvcAttributeRoutes(); } }
You can also combine attribute routing with convention-based routing.
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //enabling attribute routing routes.MapMvcAttributeRoutes(); //convention-based routing /routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }); } }
Defining Attribute Routing for Area in ASP.NET MVC
You can also define attribute routing for a controller that belongs to an area by using the RouteArea attribute. When you define attribute routing for all controllers with in an area, you can safely remove the AreaRegistration class for that area.
[RouteArea("Admin")] [RoutePrefix("menu")] [Route("{action}")] public class MenuController : Controller { // route: /admin/menu/login public ActionResult Login() { return View(); } // route: /admin/menu/products [Route("products")] public ActionResult GetProducts() { return View(); } // route: /categories [Route("~/categories")] public ActionResult Categories() { return View(); } [Route("customers/{customerId}/orders")] public IEnumerableGetOrdersByCustomer(int customerId) { //TO DO } }
What do you think?
I hope you will enjoy the Attribute Routing while working with ASP.NET MVC. I would like to have feedback from my blog readers. Your valuable feedback, question, or comments about this article are always welcome.
Take our free skill tests to evaluate your skill!

In less than 5 minutes, with our skill test, you can identify your knowledge gaps and strengths.