2012-11-30 34 views
7

Tôi đang cố gắng để có được một số hạn chế định tuyến làm việc bằng cách sử dụng kiến ​​trúc asp.net mvc 4 mới nhất. Dưới App_Start có một tệp gọi là RouteConfig.cs.Làm cách nào để sử dụng các ràng buộc trong ASP.net MVC 4 RouteConfig.cs?

Nếu tôi xóa phần ràng buộc khỏi ví dụ của tôi bên dưới, url hoạt động. Nhưng tôi cần thêm một số ràng buộc để url không khớp với mọi thứ.

nên làm việc:/video/Đánh giá/1

shold KHÔNG làm việc:/video/2458/Text-Goes-Đây

Đây là những gì tôi có:

//URL: /videos/rating/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Sort}/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Sort = UrlParameter.Optional, Page = UrlParameter.Optional }, 
    constraints: new { Sort = @"[a-zA-Z]", Page = @"\d+"} 
); 

Trả lời

11

Nếu bạn muốn nhiều thông số tùy chọn trên cùng một tuyến đường, bạn sẽ gặp sự cố vì url của bạn phải luôn chỉ định đầu tiên để sử dụng thông số thứ hai. Chỉ vì bạn sử dụng các ràng buộc không ngăn nó đánh giá các tham số, thay vào đó nó không khớp với tuyến đường này.

Cầm lấy cái này ví dụ: /videos/3

Khi điều này đang cố gắng để phù hợp, nó tìm thấy video, và nói: "OK, tôi vẫn phù hợp". Sau đó, nó nhìn vào tham số tiếp theo, đó là Sort và nó nhận giá trị 3, sau đó kiểm tra nó dựa vào ràng buộc. Ràng buộc thất bại, và vì vậy nó nói "OPPS, tôi không phù hợp với tuyến đường này", và nó chuyển sang tuyến đường tiếp theo. Để xác định trang không có tham số sắp xếp được xác định, bạn nên xác định 2 tuyến.

//URL: /videos/rating/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Sort}/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Page = UrlParameter.Optional }, 
    constraints: new { Sort = @"[a-zA-Z]+", Page = @"\d+"} 
); 

//URL: /videos/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Sort = "the actual default sort value", Page = UrlParameter.Optional }, 
    constraints: new { Page = @"\d+"} 
); 

Tôi đặt các tuyến đường cụ thể nhất trước khi có thể và kết thúc với ít nhất là cụ thể, nhưng trong trường hợp này, thứ tự không quan trọng vì những ràng buộc. Ý của tôi là giá trị được xác định nhiều nhất, vì vậy trong trường hợp này, bạn cần phải xác định sắp xếp trong tuyến đầu tiên và bạn cũng có thể chỉ định trang, vì vậy nó cụ thể hơn tuyến đường chỉ với thông số trang.

+0

Cảm ơn, điều đó đã giúp làm sáng tỏ một số vấn đề. – Maddhacker24

1

đầu vào của tôi có lẽ khá muộn, nhưng đối với những người khác vẫn đang tìm kiếm answers.To giữ cho mọi thứ đơn giản, tôi sẽ sử dụng sau đây trong tập tin RoutesConfig tôi

routes.MapRoute(
    name: "Videos", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "VideoList", action = "Index", id="" }, 
    constraints: new { id = @"\d+"} 
    ); 

Tùy thuộc vào sự lựa chọn của bạn thực hiện, id có thể UriParameter .Optional, nhưng trong kịch bản này nó sẽ là id = "", bởi vì chúng ta sẽ truyền một chuỗi/int trong suốt thời gian chạy.

phong cách này đã được thông qua từ http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

Một điều cần ghi nhớ của lớp điều khiển ước luôn luôn kết thúc với bộ điều khiển ví dụ VideoListController lớp. Lớp này sẽ được liệt kê trong thư mục bộ điều khiển có chứa các phương pháp sau đây

public ActionResult Index(string id) 
{ 
    // note this maps to the action 
    // random implementation 
    ViewBag.Message=id; 
    View() 
} 

// lưu ý phương pháp này vẫn còn trận đấu bất kỳ chuỗi ... Để phù hợp với chỉ số nguyên, phương pháp Index đã được viết lại

public ActionResult Index(int id) 
{ 
    // note this maps to the action 
    ViewBag.Message=id; 
    View() 
} 

Do đó, cách tiếp cận này hoạt động cho VideoList/Index/12 nhưng khi đặt VideoList/Index/somerandomtext nó sẽ phát ra lỗi trong khi chạy. Điều này có thể được giải quyết bằng cách sử dụng các trang lỗi. Tôi hy vọng điều này sẽ hữu ích. Bình chọn nếu nó khá hữu ích.

Các vấn đề liên quan