Tôi vừa gặp câu hỏi này và, mặc dù bây giờ nó đã khá cũ, nhưng nó vẫn rất phù hợp. Trớ trêu thay, một bình luận chính xác trong chủ đề này đã được đăng bởi một người mới bắt đầu tự thú nhận về MVC khi anh ấy viết bài đăng. Ngay cả các tài liệu ASP.NET cũng không hoàn toàn chính xác. Tôi có một dự án lớn và tôi quá tải thành công các phương thức hành động.
Nếu một người hiểu định tuyến, ngoài mẫu tuyến đường mặc định {bộ điều khiển} / {hành động} / {id} đơn giản, có thể rõ ràng rằng các hành động của bộ điều khiển có thể được ánh xạ bằng bất kỳ mẫu duy nhất nào. Một người nào đó ở đây đã nói về đa hình và nói: "HTTP không hiểu đa hình", nhưng định tuyến không liên quan gì đến HTTP. Nó chỉ đơn giản là một cơ chế để khớp mẫu chuỗi.
Cách tốt nhất để thực hiện công việc này là sử dụng các thuộc tính định tuyến, ví dụ:
[RoutePrefix("cars/{country:length(3)}")]
public class CarHireController
{
[Route("{location}/{page:int=1}", Name = "CarHireLocation")]
public ActionResult Index(string country, string location, int page)
{
return Index(country, location, null, page);
}
[Route("{location}/{subLocation}/{page:int=1}", Name = "CarHireSubLocation")]
public ActionResult Index(string country, string location, string subLocation, int page)
{
//The main work goes here
}
}
Các hành động này sẽ chăm sóc các url như /cars/usa/new-york
và /cars/usa/texas/dallas
, sẽ ánh xạ tới các hành động Index đầu tiên và thứ hai tương ứng.
Kiểm tra bộ điều khiển ví dụ này, rõ ràng là nó vượt ra ngoài mẫu tuyến đường mặc định được đề cập ở trên. Mặc định hoạt động tốt nếu cấu trúc url của bạn khớp chính xác với các quy ước đặt tên mã của bạn, nhưng điều này không phải lúc nào cũng đúng. Mã phải được mô tả về tên miền, nhưng các url thường cần phải đi xa hơn vì nội dung của chúng phải dựa trên các tiêu chí khác, chẳng hạn như yêu cầu SEO.
Lợi ích của mẫu định tuyến mặc định là nó tự động tạo các tuyến duy nhất. Điều này được thực thi bởi trình biên dịch vì các url sẽ khớp với các loại và thành viên của trình điều khiển duy nhất. Việc lăn các mẫu tuyến đường của riêng bạn sẽ đòi hỏi sự suy nghĩ cẩn thận để đảm bảo tính độc đáo và chúng hoạt động.
Lưu ý quan trọng Một nhược điểm là việc sử dụng định tuyến để tạo url cho các hành động bị quá tải không hoạt động khi dựa trên tên hành động, ví dụ: khi sử dụng UrlHelper.Action. Nhưng nó hoạt động nếu một người sử dụng các tuyến được đặt tên, ví dụ, UrlHelper.RouteUrl. Và sử dụng các tuyến đường được đặt tên là, theo các nguồn được tôn trọng, cách nào cũng được ( http://haacked.com/archive/2010/11/21/named-routes-to-the-resTHER.aspx/ ).
Chúc may mắn!