Explain routing in ASP.NET Core (conventional vs attribute routing).

4 minintermediateASP.NET-Corerouting

Quick Answer

Conventional routing defines URL patterns centrally (e.g., `{controller}/{action}/{id?}`) and is common in MVC views. Attribute routing places `[Route]`/`[HttpGet("...")]` directly on controllers/actions for precise, self-documenting routes, which is the norm for Web APIs. Both map URLs to endpoints via the routing middleware; attribute routing offers finer control while conventional routing reduces repetition.

Detailed Answer

Conventional Routing defines routes in a central location using patterns.

// Program.cs
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "blog",
    pattern: "blog/{year}/{month}/{day}/{slug}",
    defaults: new { controller = "Blog", action = "Post" });

Controller using Conventional Routing:

public class HomeController : Controller
{
    // Matches: /Home/Index
    public IActionResult Index() => View();

    // Matches: /Home/About
    public IActionResult About() => View();
    
    // Matches: /Home/Details/5
    public IActionResult Details(int id) => View();
}

Attribute Routing defines routes directly on controllers and actions using attributes.

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
    // GET: api/products
    [HttpGet]
    public IActionResult GetAll() => Ok();

    // GET: api/products/5
    [HttpGet("{id}")]
    public IActionResult GetById(int id) => Ok();

    // GET: api/products/5/reviews
    [HttpGet("{id}/reviews")]
    public IActionResult GetReviews(int id) => Ok();

    // POST: api/products
    [HttpPost]
    public IActionResult Create([FromBody] Product product) => Ok();

    // PUT: api/products/5
    [HttpPut("{id}")]
    public IActionResult Update(int id, [FromBody] Product product) => Ok();

    // DELETE: api/products/5
    [HttpDelete("{id}")]
    public IActionResult Delete(int id) => Ok();
}

Advanced Attribute Routing:

[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
public class CustomersController : ControllerBase
{
    // Custom route: api/v1/customers/search?name=John
    [HttpGet("search")]
    public IActionResult Search([FromQuery] string name) => Ok();

    // Route constraint: api/v1/customers/5 (id must be int)
    [HttpGet("{id:int}")]
    public IActionResult GetById(int id) => Ok();

    // Multiple routes for same action
    [HttpGet("")]
    [HttpGet("all")]
    public IActionResult GetAll() => Ok();
}

Key Differences:

AspectConventional RoutingAttribute Routing
Definition LocationCentralized in Program.csOn controllers/actions
FlexibilityLess flexibleMore flexible
Best ForMVC web appsWeb APIs
VisibilityGlobal patternsLocal to action
MaintenanceSingle locationScattered across controllers

Related Resources