Understanding Routing in ASP.NET Core MVC

Routing is a fundamental concept in ASP.NET Core MVC applications. It maps incoming HTTP requests to specific action methods within your controllers. This process allows you to define clean, user-friendly, and SEO-friendly URLs for your web application.

What is Routing?

In ASP.NET Core MVC, routing is handled by the routing middleware. When a request comes in, the routing middleware examines the URL and tries to match it against a set of defined routes. If a match is found, it determines which controller and action method should handle the request, along with any route parameters.

Route Templates

Routes are defined using route templates. These are strings that specify the structure of the URL. Route templates can include literal segments and variable segments (parameters) enclosed in curly braces {}.

Default Route Template

A common default route template looks like this:

"{controller=Home}/{action=Index}/{id?}"

Configuring Routes

Routes are typically configured in the Program.cs file (or Startup.cs in older .NET Core versions) within the application's request pipeline setup.

Using the Default Route

To enable the default routing, you use the MapDefaultControllerRoute extension method:

app.MapDefaultControllerRoute();

Using Route Attributes

You can also define routes directly on your controller actions using the [Route] attribute. This provides more granular control over URL patterns.

[Route("api/[controller]")]
public class ProductsController : Controller
{
    [HttpGet]
    [Route("all")] // Matches "/api/Products/all"
    public IActionResult GetAllProducts() { /* ... */ }

    [HttpGet("{id}")] // Matches "/api/Products/{id}"
    public IActionResult GetProductById(int id) { /* ... */ }
}

You can also apply a [Route] attribute to the controller itself, which then becomes a prefix for all actions within that controller:

[Route("products")]
public class ProductsController : Controller
{
    [HttpGet] // Matches "/products"
    public IActionResult Index() { /* ... */ }

    [HttpGet("{id}")] // Matches "/products/{id}"
    public IActionResult Details(int id) { /* ... */ }
}

Route Parameters

Route parameters are values captured from the URL that are passed as arguments to your action methods.

Consider this route template: products/details/{productId}.

And the corresponding action method:

public IActionResult Details(int productId)
{
    // productId will hold the value from the URL
    return View();
}

A request to /products/details/123 would match this route and call the Details action with productId set to 123.

Key Takeaway: Routing is the mechanism that connects incoming URLs to your application's logic. Understanding route templates and how to configure them is crucial for building well-structured ASP.NET Core MVC applications.

Further Reading