2010-07-24 5 views
6

Tôi hiện đang làm việc trên một cửa hàng điện tử sử dụng ASP.NET MVC 2.0. Tôi đã nhận được hầu hết nó lên và chạy, nhưng một phần đó là làm phiền tôi đang định tuyến. Tôi muốn điều này:Định tuyến động MVC 2.0 cho tên danh mục trong một cửa hàng điện tử

http://mystore.somewhere/my-category-1/

Cho đến nay tôi đã có thể giải quyết nó bằng cách sử dụng:

routes.MapRoute(
      "Category", 
      "{alias}/{pageNumber}", 
      new { controller = "Categories", action = "Browse", pageNumber = 1 }); 

Nhưng điều này bắt quá nhiều hơn chỉ là những gì tôi muốn.

Sau khi đọc qua một số câu hỏi và câu trả lời xung quanh trang web này, tôi tìm thấy một giải pháp thú vị particulary mà sẽ yêu cầu tôi để programatically đăng ký một lộ trình cho từng danh mục của tôi, vì vậy trong bản chất tôi muốn được làm

foreach (var c in Categories) 
     { 
      routes.MapRoute(
       c.Name, 
       "{" + c.Alias + "}/{action}/...anything else", 
       new { controller = "Category", action = "Index" }).RouteHandler = new CateegoryRouteHandler(c); 
     } 

Bạn nghĩ sao? Đây có phải là một ý tưởng tốt? Tôi có lẽ sẽ có khoảng 200 loại, có quá nhiều "tuyến đường" để có trong bảng định tuyến? Bạn có đề xuất giải pháp khác không?

Cảm ơn.

Kính trọng, anze

Trả lời

5

Một tuyến đường duy nhất với một hạn chế năng động có thể là một giải pháp thanh lịch hơn. Chỉ cần thiết lập ràng buộc chỉ phù hợp với danh mục của bạn.

 routes.MapRoute(
     "Category", 
     "{alias}/{pageNumber}", 
     new { controller = "Categories", action = "Browse", alias = UrlParameter.Optional, pageNumber = 1 }, 
     new { alias = new CategoryMatchConstraint() }); 


public class CategoryMatchConstraint : IRouteConstraint 
{ 
     public bool Match(HttpContextBase httpContext, 
         Route route, 
         string parameterName, 
         RouteValueDictionary values, 
         RouteDirection routeDirection) 
     { 
      var category = values.Values[parameterName] as string; 
      if (string.IsNullOrEmpty(category)) 
      { 
       return false; 
      } 
      using (var db = new MyDatabaseContext()) 
      { 
       return db.Categories.Any(c => c.Name == category); 
      } 
     } 
} 
+0

Rất tuyệt! Điều đó làm việc giống như một sự quyến rũ! Không biết về các ràng buộc tuyến đường. Cảm ơn rất nhiều! –

+0

Xin chào @tvanfosson, những gì về hiệu suất nếu có 50K loại. Theo như tôi biết có một bộ nhớ đệm bảng tuyến đường hoặc một cái gì đó như thế, nhưng trong mọi trường hợp nó kiểm tra từ db. –