Attribute Routing trong ASP.NET Core

Bài viết này chúng ta sẽ cùng tìm hiểu Attribute Routing trong ASP.NET Core. Bài trước chúng ta đã tìm hiểu về Routing và làm sao để ASP.NET Core map được request vào controller và action. Có 2 cách để bạn có thể cấu hình được routing trong ASP.NET Core.

  1. Convention based Routing
  2. Attribute-based Routing

 Chúng ta đã tìm hiểu về Convention based Routing trong bài trước. Giờ chúng ta sẽ tìm hiểu về Attribute based routing nhé.

Attribute based routing là gì?

Attribute routing sử dụng các attribute để định nghĩa trực tiếp các route trong controller action. Attribute routing giúp bạn tăng sự tiện lợi hơn khi làm việc với URL trong ứng dụng.

Trong convention based routing thì tất cả các routing được cấu hình trong class Startup. Trong Attribute Routing thì lại cấu hình trong Controller.

Làm sao để cài đặt Attribute Routing

Routes được thêm vào sử dụng Route Attribute trong controller action. Attribute Route có 3 tham số, URL pattern, tên và thứ tự. Trong ví dụ dưới đây chúng ta thêm attribute route cho action method Index và gán "Home" làm URL Pattern:

public class HomeController: Controller{
    [Route("Home")]        
    public string Index(){
        return "Hello from Index method of Home Controller";    
    }  
}

Ví dụ trên, URL /Home gọi đến method Index của controller Home. Bởi vì Route attribute trỏ URL /Home đến method này.

Sử dụng Attribute Routing ra sao?

Mở project được tạo từ bài trước. Giờ bạn hãy mở Startup.cs và tìm phương thức Configure. Thay đổi code như sau:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    if (env.IsDevelopment()) {
           app.UseDeveloperExceptionPage();
    }            
    app.UseMvc();      
}

Giờ chúng ta đã sử dụng app.UseMvc() để đăng ký MVC Middleware với không có route nào. Giờ hãy mở HomeController.cs. Sau đó thêm [Route("Home")] vào method Index:

[Route("Home")]
public string Index() {
    return "Hello from Index method of Home Controller";
}

Khi chúng ta gọi URL /Home thì Index method của HomeController được gọi:

URL Có tìm thấy? Nhận diện
/ Không  
/Home Controller=Home
Action=Index
/Home/Index Không

 Giờ thay đổi sang URL Pattern "Home/Index":

[Route("Home/Index")]
public string Index() {
    return "Hello from Index method of Home Controller";        
}
URL Tìm thấy? Nhận diện
/ Không  
/Home Không  
/Home/Index Controller=Home
Action=Index

 Thay đổi tên của Action Method

Chú ý rất quan trọng là URL Pattern không cần phải đúng với tên Controller và tên Action method. Ví dụ:

[Route("Say/Hello")]
public string Index(){
    return "Hello from Index method of Home Controller";        
}
URL Tìm thấy? Nhận diện
/ Không  
/Home Không  
/Home/Index Không  
/Say/Hello Controller=Home
Action=Index

Nhiều Routes 

Bạn cũng có thể đặt nhiều Route cho một Action method đơn sử dụng nhiều Routing Attribute như sau:

[Route("")]
[Route("Home")]
[Route("Home/Index")]
public string Index(){
    return "Hello from Index method of Home Controller";        
}
URL Tìm thấy? Nhận diện
/ Controller=Home
Action=Index
/Home Controller=Home
Action=Index
/Home/Index Controller=Home
Action=Index
/Say/Hello Không

Token Replacement

Attribute Routing dễ dàng hơn cho chúng ta bằng cách sử dụng tokens dạng như một biến thay thế. Ví dụ: [area], [controller] và [action]. Những token này sẽ được thay thế bởi các giá trị thực tế trong Route Collection:

[Route("")]
[Route("[controller]")]
[Route("[controller]/[action]")]
public string Index() {
    return "Hello from Index method of Home Controller";        
}

Các token trong URL Pattern đảm bảo rằng tên Controller và tên Action nằm ở đó sẽ được đồng bộ với tên của class controller tự động.

Tham số gán vào Action method

Cũng giống như Convention based Routing, chúng ta có thể định nghĩa các URL Parameter tức là các tham số trên URL trong cặp ngoặc nhọn. Nó có thể được gán vào như là một tham số của Action method:

[Route("")]
[Route("[controller]")]
[Route("[controller]/[action]/{id?}")]
public string Index(string id) {
   if (id !=null) {
      return "Received " + id.ToString();
   } else {
       return "Received nothing";            
   }        
}

Trong ví dụ trên, id là một tham số tùy chọn. Bất cứ giá trị nào được nhận dược đều được truyền vào method Index như là một tham số.

Kết hợp các Route

Chúng ta có thể chỉ ra route attribute trong Controller class. Bất cứ URL Pattern nào được định nghĩa trên Controller thì đều được gắn vào URL Pattern của Action method:

[Route("Home")]   
public class HomeController : Controller {        
    [Route("Index")]        
    public string Index() {
        return "Hello from Index method of Home Controller";        
    }     
} 

Đoạn code trên sẽ thỏa mãn Route "Home/Index". Nếu Pattern bắt đầu với / thì nó được xem xét như đường dẫn tuyệt đối và không được kết hợp với URL Pattern.

Nó sẽ không làm việc cho URL "Home/Index":

[Route("Home")]   
public class HomeController : Controller {        
    [Route("/Index")]        
    public string Index() {
        return "Hello from Index method of Home Controller";        
    }     
} 

Trộn Routing

Bạn cũng có thể sử dụng cả hai cơ chế convention-based routing và attribute based routing trong một project. Tuy nhiên nếu bạn định nghĩa attribute routing trong action thì convention-based routing sẽ không thể sử dụng trong action. Hay nói cách khác thì attribute-based routing sẽ được ưu tiên trước convention-based routing.

Action Verbs

Attribute route cũng có thể được dùng với HTTP Verb attribute như HttpGet, HttpPost...

[HttpGet("")]
[HttpGet("Home")]
[HttpGet("Home/Index")]
public string Index() {
    return "Hello from Index method of Home Controller";        
}

Tổng kết

Chúng ta đã tìm hiểu cách thứ 2 để định nghĩa cơ chế routing cho ứng dụng.

Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.

Lên trên