Routing trong ASP.NET MVC

ASP.NET MVC đã giới thiệu Routing để loại bỏ việc ánh xạ từng URL bằng một tập tin vật lý. Routing (định tuyến) cho phép chúng ta xác định mẫu URL ánh xạ tới trình xử lý yêu cầu.

Trong ứng dụng ASP.NET MVC, trình xử lý yêu cầu là phương thức hành động (action method) của một lớp Controller.

Ví dụ: http://domain/student có thể được ánh xạ tới phương thức hành động Index của StudentController trong ASP.NET MVC.

Tuyến trong ASP.NET MVC

Route (tuyến) xác định mẫu URL và thông tin xử lý. Tất cả các tuyến được cấu hình của một ứng dụng được lưu trữ trong RouteTable và sẽ được sử dụng bởi công cụ định tuyến (routing engine) để xác định controller thích hợp cho yêu cầu đến.

Hình dưới đây minh họa quá trình định tuyến.

Quá trình định tuyến

Cấu hình tuyến trong ASP.NET MVC

Mỗi ứng dụng ASP.NET MVC phải cấu hình ít nhất một tuyến đã được cấu hình mặc định. Bạn có thể đăng ký tuyến trong lớp RouteConfig, nằm trong tập tin RouteConfig.cs trong thư mục App_Start.

Hình ảnh dưới đây minh họa cách cấu hình tuyến trong lớp RouteConfig.

Cấu hình tuyến trong ASP.NET MVC

Như bạn có thể thấy trong hình trên, tuyến được cấu hình bằng phương thức mở rộng MapRoute() của RouteCollection, trong đó tên tuyến là "Default", mẫu URL của tuyến là {controller}/{action}/{id} và giá trị mặc định cho tham số  controller, phương thức hành động và tham số id.

Giá trị tham số mặc định chỉ định controller, phương thức hành động hoặc giá trị của tham số id sẽ được sử dụng nếu chúng không tồn tại trong URL yêu cầu gửi đến.

Tương tự, bạn có thể cấu hình các tuyến khác bằng phương thức MapRoute của RouteCollection. RouteCollection thực chất là một thuộc tính của lớp RouteTable.

Mẫu URL trong ASP.NET MVC

Mẫu URL chỉ là phần sau của tên miền trong URL. Ví dụ: mẫu URL {controller}/{action}/{id} sẽ có URL thật trông giống như sau: "localhost:1234/{controller}/{action}/{id}".

Phần đằng sau "localhost:1234/" sẽ được coi là mẫu URL. Phần đầu tiền ngay sau tên miền nếu có sẽ là controller. Phần tiếp theo ngay sau controller nếu có sẽ là phương thức hành động của controller. Phần tiếp theo ngay sau phương thức hành động nếu có sẽ là tham số id.

Mẫu URL routing trong ASP.NET MVC

Nếu URL không chứa bất cứ thứ gì sau tên miền thì controller và phương thức hành động mặc định sẽ xử lý yêu cầu.

Ví dụ: http://localhost:1234/ sẽ được xử lý bởi phương thức HomeController và phương thức hành động Index như được cấu hình trong tham số mặc định.

Bảng sau đây cho biết controller, phương thức hành động và tham số id nào sẽ xử lý các URL khác nhau khi đánh giá tuyến mặc định ở trên.

URL Controller Action Id
http://localhost/home HomeController Index null
http://localhost/home/index/123 HomeController Index 123
http://localhost/home/about HomeController About null
http://localhost/home/contact HomeController Contact null
http://localhost/student StudentController Index null
http://localhost/student/edit/123 StudentController Edit 123

Nhiều tuyến trong ASP.NET MVC

Bạn cũng có thể thêm cấu hình tuyến tùy chỉnh bằng phương thức mở rộng MapRoute. Bạn cần cung cấp ít nhất hai tham số trong MapRoute là tên tuyến và mẫu URL. Tham số mặc định là tùy chọn.

Bạn có thể đăng ký nhiều tuyến tùy chỉnh với các tên khác nhau. Hãy xem ví dụ sau nơi chúng tôi đăng ký tuyến "Student".

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Student",
            url: "student/{id}",
            defaults: new { controller = "Student", action = "Index"}
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
} 

Như được trình bày trong đoạn mã trên, mẫu URL cho tuyến Student là students/{id}, chỉ định rằng bất kỳ URL nào bắt đầu bằng /student, phải được StudentController xử lý.

Lưu ý rằng chúng tôi chưa chỉ định tham số {action} trong mẫu URL vì chúng tôi muốn mọi URL bắt đầu bằng sinh viên phải luôn sử dụng phương thức hành động Index của StudentController.

Chúng tôi đã chỉ định controller và phương thức hành động mặc định để xử lý bất kỳ URL yêu cầu nào bắt đầu bằng /student.

ASP.NET MVC đánh giá từng tuyến theo trình tự cấu hình. Nó bắt đầu với tuyến được cấu hình đầu tiên và nếu URL của yêu cầu đến không thỏa mãn mẫu URL của tuyến thì nó sẽ chuyển sang tuyến thứ hai, v.v.

Trong ví dụ trên, công cụ định tuyến sẽ đánh giá tuyến Student trước và nếu URL đến không bắt đầu bằng /student thì nó sẽ chuyển sang tuyến thứ hai là tuyến mặc định.

Bảng sau đây cho biết các URL khác nhau sẽ được ánh xạ tới tuyến Student như thế nào:

URL Controller Action Id
http://localhost/student/123 StudentController Index 123
http://localhost/student/index/123 StudentController Index 123
http://localhost/student?Id=123 StudentController Index 123

Ràng buộc tuyến trong ASP.NET MVC

Bạn cũng có thể áp dụng các ràng buộc đối với giá trị của tham số bằng cách cấu hình các ràng buộc tuyến. Ví dụ: tuyến sau áp dụng một hạn chế đối với tham số id đó là giá trị của id phải là số.

routes.MapRoute(
    name: "Student",
    url: "student/{id}/{name}/{standardId}",
    defaults: new 
    { 
        controller = "Student", 
        action = "Index", 
        id = UrlParameter.Optional, 
        name = UrlParameter.Optional, 
        standardId = UrlParameter.Optional 
    },
    constraints: new { id = @"\d+" }
);

Vì vậy, nếu bạn đưa ra giá trị không phải là số cho tham số id thì yêu cầu đó sẽ được xử lý bởi một tuyến khác hoặc, nếu không có tuyến nào phù hợp thì lỗi "The resource could not be found" sẽ bị ném ra.

Đăng ký tuyến trong ASP.NET MVC

Bây giờ, sau khi cấu hình tất cả các tuyến trong lớp RouteConfig, bạn cần đăng ký nó vào sự kiện Application_Start() trong Global.asax. Do đó, nó sẽ thêm tất cả các tuyến của bạn vào RouteTable.

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}

Hình dưới đây minh họa quá trình đăng ký tuyến.

Đăng ký tuyến trong ASP.NET MVC

Do đó, định tuyến đóng vai trò rất quan trọng trong ASP.NET MVC.

Những điểm cần nhớ:

  1. Định tuyến đóng vai trò quan trọng trong ASP.NET MVC. Định tuyến ánh xạ URL của yêu cầu tới phương thức hành động của controller để xử lý và phản hồi.
  2. Tuyến chứa mẫu URL và thông tin xử lý. Mẫu URL là phần bắt đầu ngay sau tên miền.
  3. Có thể cấu hình tuyến trong lớp RouteConfig. Có thể thêm nhiều tuyến tùy chỉnh vào cấu hình tuyến.
  4. Có thể áp dụng các ràng buộc cho các tham số của tuyến để chúng chỉ nhận các giá trị phù hợp.
  5. Tuyến phải được đăng ký trong sự kiện Application_Start trong tập tin Global.ascx.cs.
ASP.NET MVC
Bài Viết Liên Quan:
Lớp HtmlHelper trong ASP.NET MVC
Trung Nguyen 28/05/2020
Lớp HtmlHelper trong ASP.NET MVC

Lớp HtmlHelper trong ASP.NET MVC là gì? Cách sử dụng HtmlHelper để tạo ra các phần tử HTML trong Razor View.

Cú pháp Razor trong ASP.NET MVC
Trung Nguyen 27/05/2020
Cú pháp Razor trong ASP.NET MVC

Cách sử dụng cú pháp Razor để viết mã C# hoặc VB.NET trong Razor View trong ASP.NET MVC.

Tạo View cập nhật trong ASP.NET MVC
Trung Nguyen 27/05/2020
Tạo View cập nhật trong ASP.NET MVC

Tìm hiểu cách tạo view cho chức năng chỉnh sửa thông tin sinh viên trong ASP.NET MVC.

Model Binding trong ASP.NET MVC
Trung Nguyen 26/05/2020
Model Binding trong ASP.NET MVC

Tìm hiểu về Model Binding trong ASP.NET MVC. Tự động nạp các tham số của phương thức hành động.