ASP.NET MVC Routing module chịu trách nhiệm map incoming browser requests đến particular MVC controller actions. Khi ứng dụng ASP.NET MVC khởi chạy, ứng dụng đăng ký một hoặc nhiều patterns với route table của framework để báo cho routing engine xử lý requests match patterns đó. Khi routing engine nhận request tại runtime, nó match URL của request với URL patterns đã đăng ký và trả response theo pattern match.
ASP.NET giới thiệu Routing để loại bỏ việc map từng URL với physical file. Routing cho phép định nghĩa URL pattern map đến request handler. System.Web.Routing dùng bởi MVC framework, cũng dùng bởi ASP.NET Dynamic Data. MVC framework dùng routing để direct request đến controller. File Global.asax là nơi định nghĩa route cho ứng dụng.
Route Config của MVC Application
public class RouteConfig {
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Route Name
Route là URL pattern map đến handler. Handler có thể là controller trong MVC application xử lý request. Route name dùng như reference cụ thể đến route đã cho.
Constraints
Set constraints áp dụng cho URL pattern để narrow down URL match.
URL Pattern
URL pattern chứa literal values và variable placeholders. Literals và placeholders nằm trong segments của URL được phân cách bởi slash (/).
Khi request đến, URL được parse thành segments và placeholders, variable values cung cấp cho request handler. Process này tương tự cách data trong query strings được parse và pass cho handler. Cả hai cases variable info included trong URL và pass cho handler dạng key-value pairs. Với query strings cả keys và values đều trong URL. Với routes, keys là placeholder names định nghĩa trong URL pattern, chỉ values trong URL.
Defaults
Khi định nghĩa route, có thể assign default value cho parameter. Defaults là object chứa default route values. Ba segments của default route chứa Controller, Action và Id.
Trong URL trên, controller và action tương ứng sẽ được match. Nếu không gửi controller và action method trong URL, dựa trên default route, controller action method tương ứng sẽ được invoke.
Chi tiết 3 Segments
| Segment | Placeholder | Default Value | Mô tả |
|---|---|---|---|
| 1 | {controller} | Home | Tên Controller (bỏ suffix "Controller") |
| 2 | {action} | Index | Tên Action Method |
| 3 | {id} | UrlParameter.Optional | Parameter tùy chọn (id, slug, v.v.) |
Ví dụ URL Mapping
| URL | Controller | Action | Id |
|---|---|---|---|
| / | Home | Index | (optional) |
| /Home | Home | Index | (optional) |
| /Home/Index | Home | Index | (optional) |
| /Product | Product | Index | (optional) |
| /Product/Details | Product | Details | (optional) |
| /Product/Details/5 | Product | Details | 5 |
| /Product/Edit/10 | Product | Edit | 10 |
Route Constraints (Ràng buộc)
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { id = @"\d+" } // Chỉ chấp nhận số
);
Attribute Routing (MVC 5+)
[RoutePrefix("api/products")]
public class ProductsController : ApiController {
[Route("{id:int}")]
public IHttpActionResult Get(int id) { ... }
[Route("search/{term}")]
public IHttpActionResult Search(string term) { ... }
}
// RouteConfig.cs
routes.MapMvcAttributeRoutes();
ASP.NET Core Endpoint Routing
app.UseEndpoints(endpoints => {
// Conventional routing
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
// Attribute routing (controllers)
endpoints.MapControllers();
// Razor Pages
endpoints.MapRazorPages();
// Minimal APIs
endpoints.MapGet("/hello", () => "Hello World!");
});