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.cshoặc trong attributes - Mô tả cách URL paths được match đến actions
- Được dùng để generate URLs cho links trong responses
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
| URL Path | Controller | Action | id |
|---|---|---|---|
/Products/Details/5 | Products | Details | 5 |
/Products/Details | Products | Details | null (model binding set 0) |
/Home | Home | Index | null |
/ | Home | Index | null |
Lưu ý: Route template định nghĩaidlà optional. Khiidbị omit khỏi URL, model binding setidthành0, và thường không tìm thấy entity nào trong database matchingid == 0.
Conventional Routing
Nguyên tắc cơ bản
Conventional routing thiết lập quy ước cho URL paths:| Segment | Maps to |
|---|---|
{controller=Home} | Tên controller (suffix “Controller” được loại bỏ) |
{action=Index} | Tên action method |
{id?} | Optional id — maps to model entity |
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ềuMapControllerRoute và MapAreaControllerRoute:
| Route | Pattern | Khi nào match |
|---|---|---|
blog | blog/{*article} | /blog, /blog/abc, /blog/abc/def |
default | {controller=Home}/{action=Index}/{id?} | Mọi URL còn lại |
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:| Attribute | HTTP Method | Ví dụ URL |
|---|---|---|
[HttpGet] | GET | GET /api/products |
[HttpPost] | POST | POST /api/products |
[HttpPut] | PUT | PUT /api/products/5 |
[HttpDelete] | DELETE | DELETE /api/products/5 |
[HttpPatch] | PATCH | PATCH /api/products/5 |
[HttpHead] | HEAD | HEAD /api/products |
Kết hợp Routes
| Route trên Controller | Route trên Action | URL cuối cùng |
|---|---|---|
[Route("products")] | [HttpGet] | /products |
[Route("products")] | [HttpGet("{id}")] | /products/{id} |
Token Replacement
Dùng[controller] và [action] để tự động thay thế tên:
Route với Route Constraints
| Constraint | Mô tả | Ví dụ |
|---|---|---|
:int | Chỉ integer | {id:int} |
:long | Chỉ long | {id:long} |
:float | Chỉ float | {id:float} |
:bool | Chỉ boolean | {id:bool} |
:alpha | Chỉ alphabet | {name:alpha} |
:length(min,max) | Giới hạn độ dài | {name:length(3,20)} |
:range(min,max) | Giới hạn giá trị | {id:range(1,100)} |
Giải quyết Ambiguous Actions
Khi hai endpoints match qua routing:| HTTP Method | Action được chọn | Lý do |
|---|---|---|
| GET | Edit(int id) | Không có [HttpPost] |
| POST | Edit(int id, Product) | [HttpPost] match |
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:| Route Name | Dùng cho |
|---|---|
| URL Matching | ❌ Không ảnh hưởng |
| URL Generation | ✅ Dùng để generate links |
Reserved Route Parameter Names
Khi dùng Controllers hoặc Razor Pages
| Từ khóa | Ghi chú |
|---|---|
action | Reserved |
area | Reserved |
controller | Reserved |
handler | Reserved |
page | Reserved |
Trong Razor View/Page Context
page, using, namespace, inject, section, inherits, model, addTagHelper, removeTagHelper là reserved.
So sánh Conventional vs Attribute Routing
| Tiêu chí | Conventional Routing | Attribute Routing |
|---|---|---|
| Cấu hình | Program.cs | [Route] trên controller/action |
| URL dựa trên | Controller/Action names | Tùy chỉnh hoàn toàn |
| REST APIs | ❌ Ít phù hợp | ✅ Phù hợp nhất |
| Web UI apps | ✅ Phù hợp | Có thể dùng |
| Fine-grained control | ❌ Hạn chế | ✅ Kiểm soát chính xác |
| DRY | ✅ DRY | ⚠️ Có thể lặp lại |
Khuyến nghị: REST APIs → Attribute Routing. Web UI apps với CRUD → Conventional Routing là điểm khởi đầu tốt.