Routing là gì?

ASP.NET Core controllers sử dụng Routing middleware để match URLs của incoming requests và map chúng đến các actions. Route templates:
  • Được định nghĩa tại startup trong Program.cs hoặc trong attributes
  • Mô tả cách URL paths được match đến actions
  • Được dùng để generate URLs cho links trong responses
Actions có thể là conventionally-routed hoặc attribute-routed. Đặt route trên controller hoặc action sẽ biến nó thành attribute-routed.

Thiết lập Conventional Route

Cấu hình mặc định

ASP.NET Core MVC template tạo conventional routing code như sau:

Giải thích Route Template

Lưu ý: Route template định nghĩa id là optional. Khi id bị omit khỏi URL, model binding set id thành 0, và thường không tìm thấy entity nào trong database matching id == 0.

Conventional Routing

Nguyên tắc cơ bản

Conventional routing thiết lập quy ước cho URL paths:

Ví dụ Controller

Lợi ích của Conventional Routing

  • URL nhất quán cho CRUD operations
  • Không cần tạo URL pattern mới cho mỗi action
  • UI dễ dự đoán
Khuyến nghị: Hầu hết apps nên chọn một routing scheme cơ bản và descriptive để URLs dễ đọc và có ý nghĩa.

Nhiều Conventional Routes

Có thể cấu hình nhiều conventional routes bằng cách thêm nhiều MapControllerRouteMapAreaControllerRoute:

Thứ tự ưu tiên

  • Routes thêm trước có ưu tiên cao hơn
  • Routes cụ thể nên đặt trước
  • Routes greedy (catch-all {*article}) nên đặt sau

Attribute Routing

Giới thiệu

REST APIs nên dùng attribute routing để model app’s functionality như một tập resources, với operations được biểu diễn bằng HTTP verbs.

Cấu hình Controller với Attribute Routing

HTTP Verb Templates

ASP.NET Core cung cấp các HTTP verb templates:

Kết hợp Routes

Token Replacement

Dùng [controller][action] để tự động thay thế tên:

Route với Route Constraints


Giải quyết Ambiguous Actions

Khi hai endpoints match qua routing:
Lưu ý: Nếu routing không thể chọn candidate tốt nhất, nó sẽ throw AmbiguousMatchException.

Route Names

Route names cung cấp tên logic cho route, dùng cho URL generation:

Reserved Route Parameter Names

Khi dùng Controllers hoặc Razor Pages

Trong Razor View/Page Context

page, using, namespace, inject, section, inherits, model, addTagHelper, removeTagHelper là reserved.

So sánh Conventional vs Attribute Routing

Khuyến nghị: REST APIs → Attribute Routing. Web UI apps với CRUD → Conventional Routing là điểm khởi đầu tốt.

Tài liệu tham khảo