TOC

This article is currently in the process of being translated into Vietnamese (~36% done).

Routing:

Attribute routing

Ở bài trước ta đã tìm hiểu về đường dẫn, cách thức hoạt động và làm thế nào để định nghĩa đường dẫn trong Startup.cs. Tuy nhiên, ASP.NET MVC cho phếp ta định nghĩa trực tiếp trong Controller và/hoặc cả action gọi là thuộc tính đường dẫn. Ví dụ:

[Route("/products")]  
public class ProductController : Controller  
{
    public IActionResult Index()  
    {  
return Content("Products Index");  
    }  
}

Pay attention to the very first line of the example, where I use the Route() attribute method to define a routing template for this controller. You will notice that my controller uses the word "product" in the singular form, but I would like to use the plural form for the URL's. I can accomplish just that by defining this word as the routing template for the Controller - with that in place, I can now access URL's like /products/ or /products, since they will just default to our Index method.

That was very basic and only works because it automatically falls back to the Index method, but attribute routing allows for much more complicated use-cases as well. For instance, our Controller could also be used to serve a single product instead of the general index/overview. Let's add a method for that, and define an access route for it at the same time:

[Route("/products")]
public class ProductController : Controller
{      
public IActionResult Index()
{
return Content("Products Index");
}

[Route("{id}")]
public IActionResult Details(int id)
{
return Content("Product #" + id);
}
}

Chúng ta đã thêm thuộc tính đường dẫn vào phương thức Details. Chúng dùng khai báo đặc biệt để định nghĩa biến, khai báo bên trong dấu {}. Chúng ta bàn sâu hơn, nhưng giờ chú ý rằng nó cho phép chúng ta xác định tham số truyền vào phương thức. Ta có thể tải xuống sản phẩm với ID và hiển thị cho người dùng. Vậy, URL có dạng /products/42/products/84/ (dấu / cuối có thể có hoặc không).

Please notice that I only use the last part of the URL in the route template (the ID) because the Controller already specifies that it should be called with the word products first. If that wasn't the case, we would have to define the entire URL for this specific method instead, like this:

[Route("/products/{id}")]
public IActionResult Details(int id)
{
return Content("Product #" + id);
}

So, whether you define it partially for the Controller and partially for the method, or specify it all on each method, is really up to you and the situation. It could be useful to define it all on each method if your Controller should support more than one entrance URL, but in most situations, you could probably save a few keystrokes by defining a common entrance for the Controller and then the rest for each method.

Trong một số tình huống, bạn có thể muốn một phương thức có nhiều đường dẫn. Rất dễ dàng, bạn có thể định nghĩa bao nhiêu tùy thích. Bạn có thể kết hợp như sau:

[Route("/products")]
public class ProductController : Controller
{      
public IActionResult Index()
{
return Content("Products Index");
}

[Route("{id}")]
[Route("/product/{id}")]
public IActionResult Details(int id)
{
return Content("Product #" + id);
}
}

With that in place, our product details page can now be accessed using URL's with both the singular and the plural form of the word "product". This specific result could be accomplished in other ways, with a more flexible route, but it serves as a nice demonstration of how easy it is to define multiple routes.

Summary

Thuộc tính đường dẫn là cách tốt để thay thế cách cũ. Bởi chúng được định nghĩa trực tiếp trong Controller. Có một số hạn chế nhưng không quá quan trọng. Nếu bạn có vấn đề gì thì có thể kết hợp với cả cách truyền thống.

So, at the end of the day, whether to use Attribute routing or not comes down to personal taste and the requirements of the project you are working on.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!