2009-07-10 35 views
13

tôi cần phải thực hiện một trang web MVC với url mỗi bên dưới:ASP.net MVC đường tùy chỉnh xử lý/chế

  • mục1/sản phẩm/1/wiki
  • mục1/sản phẩm/2/wiki
  • Danh mục1/tiểu mục2/sản phẩm/3/wiki
  • mục1/tiểu mục2/tiểu category3/sản phẩm/4/wiki
  • vv vv

trong đó tiêu chí phù hợp là url kết thúc bằng "wiki".

Thật không may là nhận tất cả dưới đây chỉ hoạt động ở phần cuối cùng của url:

routes.MapRoute("page1", // Route name 
       "{*path}/wiki", // URL with parameters 
       new { controller = "Wiki", action = "page", version = "" } // Parameter defaults 

Tôi đã không có thời gian để đi qua các tùy chọn mở rộng MVC vì vậy tôi đã tự hỏi những lựa chọn có thể cho là gì thực hiện điều này? Bất kỳ mẫu/ví dụ nào sẽ thật tuyệt vời!

Trả lời

15

Như bạn đã đề cập, thông số bắt tất cả chỉ xuất hiện ở cuối tuyến - mã bạn đã đăng sẽ ném lỗi thời gian chạy và cung cấp cho bạn màn hình màu vàng chết nếu bạn thậm chí cố gắng chạy ứng dụng của bạn.

Có một số điểm có thể mở rộng để xây dựng kịch bản định tuyến tùy chỉnh. Đây là - Route, RouteBase và IRouteHandler.

Bạn có thể tạo danh sách các tuyến đường được tạo để xử lý bằng cách mở rộng RouteBase. Thông thường bạn sẽ làm theo mẫu của việc có một hàm tạo trong một tài nguyên (tên bộ điều khiển), và sau đó gán cho nó một danh sách các tuyến mà nó chịu trách nhiệm và sau đó ánh xạ nó trong global.asax của bạn. Dưới đây là một số mã ví dụ bạn có thể tạo từ:

public class MyRoute : RouteBase 
{ 
    private List<Route> _routes = new List<Route>(); 

    public MyRoute(string resource) 
    { 
     // make a Resource property, not shown in this example 
     this.Resource = resource; 

     // Generate all your routes here 
     _routes.Add(
      new Route("some/url/{param1}", 
      new McvRouteHandler { 
       Defaults = new RouteValueDictionary(new { 
        controller = resource, 
        action = actionName 
       }), 
      Constraints = new RouteValueDictionary() 
     ); 
     _routes.Add(...); // another new route 
    } 

    public override RouteData GetRouteData(HttpContextBase context) 
    { 
     foreach (var route in _routes) 
     { 
      var data = route.GetRouteData(context); 
      if (data != null) 
      { 
       return data; 
      } 
     } 
     return null; 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext context, RouteValueDictionary rvd) 
    { 
     foreach (var route in _routes) 
     { 
      var path = route.GetVirtualPath(context, rvd); 
      if (path != null) 
      { 
       return path; 
      } 
     } 
     return null; 
    } 
} 

Để sử dụng lớp định tuyến, hãy thực hiện routes.Add(new MyRoute("page1")); trong Global.asax của bạn.

Nếu bạn cần kiểm soát nhiều hơn, bạn có thể triển khai IRouteHandler và thay vì tạo MvcRouteHandlers() cho các tuyến đường của bạn như trong ví dụ trên, hãy sử dụng IRouteHandler của riêng bạn. Điều này sẽ cho phép bạn ghi đè lên logic của việc chọn bộ điều khiển từ dữ liệu yêu cầu.

Toàn bộ khung công tác là cực kỳ có thể mở rộng, nhưng bạn sẽ cần tìm hiểu một chút để thực hiện đúng. Tôi sẽ đề nghị đơn giản sắp xếp lại URL của bạn nếu có thể để tận dụng lợi thế của tham số catch-all nếu bạn có thể.

+1

Elastic.Routing (https://github.com/lokiworld/Elastic.Routing) mở rộng định tuyến MVC tích hợp và cung cấp cho bạn khả năng sử dụng bắt tất cả ở bất kỳ đoạn nào trên tuyến đường của bạn cũng như một số mục khác những thứ như phân đoạn tùy chọn. – BrutalDev

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