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:
| Aspect | Conventional Routing | Attribute Routing |
|---|---|---|
| Definition Location | Centralized in Program.cs | On controllers/actions |
| Flexibility | Less flexible | More flexible |
| Best For | MVC web apps | Web APIs |
| Visibility | Global patterns | Local to action |
| Maintenance | Single location | Scattered across controllers |