Roadmap › ASP.NET Core MVC (and Razor Pages) › Module: MVC Basics
Lessons in this course (15)

4. Routing: conventional vs attribute

Basic★ Must knowLesson 4 of 15
csharp
// Conventional (Program.cs)
app.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute("blog", "blog/{year:int}/{slug}", defaults: new { controller = "Blog", action = "Post" });

// Attribute routing
[Route("shop/products")]
public class ProductsController : Controller
{
    [HttpGet("")] public IActionResult Index() => View();
    [HttpGet("{id:int:min(1)}")] public IActionResult Details(int id) => View();
    [HttpGet("by-category/{name:alpha}")] public IActionResult ByCategory(string name) => View();
}
  • Route constraints: int, bool, guid, datetime, min(1), range(1,100), alpha, regex(...), length(3,20).
  • Endpoint routing (3.0+): UseRouting() selects the endpoint early so middleware like CORS/auth know which endpoint (and its metadata) will run.
  • Areas split large apps: [Area("Admin")] + route {area:exists}/{controller}/{action}.
  • Generate URLs, never hard-code: Url.Action("Details", "Products", new { id }), asp-action tag helper.