2012-03-04 22 views
8

Tôi có một khách hàng nào muốn sử dụng một quy ước URL đặt tên dọc theo dòng:ASP.Net MVC với các tuyến đường phức tạp - làm thế nào để giữ cho nó "lành mạnh"?

/{subjectarea}/{subject}/{action} 

nào là tốt - điều này hoạt động rực rỡ, với một bộ điều khiển cho mỗi môn học, và có những hành động sau khi id (tùy) không có vấn đề gì cả.

Tuy nhiên, nó sẽ trở nên phức tạp, như các khách hàng sau đó muốn tiếp tục thêm hệ thống phân cấp:

/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction} 

Tôi có một bộ điều khiển cho các đối tượng có liên quan chặt chẽ (chỉ cần nó một vấn đề) mà xử lý tất cả các phía quản trị viên, nhưng khách hàng nhất quyết về việc có chế độ xem công khai bị treo ngoài chủ đề gốc chứ không phải gốc của nó.

Làm thế nào tôi có thể làm điều này trong khi tránh phá vỡ toàn bộ hiệu trưởng của MVC, và cũng tránh tái triển khai một tấn ASP.Net MVC cung cấp chức năng trong bộ điều khiển khu vực chủ đề của tôi chỉ để có thể xử lý các đối tượng liên quan từ đó bộ điều khiển?

Có thể nào đó gọi bộ điều khiển chủ thể liên quan từ bên trong bộ điều khiển chủ đề gốc và trả về kết quả (vì điều này sẽ giữ chức năng tách cho đối tượng với bộ điều khiển riêng của chúng) không? Nếu điều đó là có thể, nó sẽ giải quyết rất nhiều vấn đề với điều này.

Trả lời

2

Đây là giải pháp giải quyết được vấn đề của tôi - hy vọng nó sẽ giải quyết được một số người khác. Như đã đề cập trong bình luận của tôi với Robert Harvey, tất cả những gì tôi thực sự cần là một tuyến đường khác không sử dụng hai hoặc ba thành phần đầu tiên như bộ điều khiển, hành động và id, mà thay vào đó sẽ lấy các giá trị đó từ sau này - nếu bạn treo này ra khỏi một giá trị tĩnh trong các tuyến đường là tốt, nó dễ dàng hơn nhiều để làm.

Vì vậy, đây là url tôi quyết định để đơn giản hóa các tuyến đường:

/{subjectarea}/{subject}/related/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction} 

Các tuyến đường mà thỏa mãn URL này là như sau:

 routes.MapRoute(
      "RelatedSubjects", 
      "{parentcontroller}/{parentsubject}/related/{controller}/{id}/{action}", 
      new { controller = "shoes", action = "view", id = "all" } 
     ); 

Trên controller action tiếp theo, tôi có thể yêu cầu các giá trị tham số cho parentcontroller và parentubject vì vậy tôi có thể lọc ra các mục liên quan để chỉ được cụ thể cho chủ đề cha mẹ đã cho - vấn đề được giải quyết!

Tuyến đường này cần phải cao hơn các tuyến đường chỉ đối phó với hai giá trị đầu tiên, nếu không bạn sẽ gặp nguy cơ một bản đồ tuyến đường khác chiếm đoạt yêu cầu.

Tôi có thể làm điều này hoàn toàn không có phần/liên quan/tĩnh vì tuyến đường có thể dễ dàng khớp với số lượng giá trị một mình, và tôi thực sự có thể làm như vậy - tuy nhiên, tôi xem xét nó tốt hơn cho quản trị sau này mục trong đó để xác nhận việc sử dụng tuyến đường.

Tôi hy vọng điều này sẽ giúp ai đó!

+0

Đây chính xác là những gì tôi đã từng làm, sử dụng bộ điều khiển xem mới nhưng vẫn duy trì quyền truy cập vào bộ điều khiển cha mẹ và các tham số cha. Cảm ơn bạn đã đăng những phát hiện của mình. –

1

Một cách để bạn có thể làm điều đó là xác định một lộ trình ký tự đại diện (chú ý dấu sao):

routes.MapRoute("subjects", "{action}/{*path}", 
    new { controller = "Subjects", action = "Index" }); 

này cho phép bộ điều khiển để nhận toàn bộ chuỗi đường dẫn sau action.

Sau đó bạn có thể có được hệ thống phân cấp của các đối tượng trong các phương pháp điều khiển như vậy:

string[] subjects = path.Split('/'); 

Khi bạn đã có, bạn có thể làm bất cứ điều gì bạn muốn, bao gồm cử các đối tượng khác nhau với các phương pháp xử lý khác nhau để xử lý.

+0

Đó là cách tôi xem trước khi đăng câu hỏi - tuy nhiên, nó có tác dụng phụ của việc ném ra hầu hết những gì ASP.Net MVC cung cấp cho tôi trong đó có rất nhiều "định tuyến" tôi sẽ phải làm tay trong phương pháp điều khiển xử lý các hành động - đó là những gì tôi đã cố gắng để tránh. Nếu tôi có thể chọn giá trị controller, action và id, thì tôi có thể bỏ mọi thứ tới bộ điều khiển đích, thay vì phải thực hiện lại mọi thứ trên bộ điều khiển hiện tại (cũng sẽ vi phạm nguyên tắc trách nhiệm duy nhất). Điều đó có ý nghĩa? – Moo

+0

Giá trị của nó chỉ ra rằng vấn đề không phải là cách lấy giá trị từ tuyến đường, cách lấy kết quả từ bộ điều khiển chính xác, trong khi ở trong bộ điều khiển khác - nếu có thể thực hiện điều đó .... và tôi dấu vết trong suy nghĩ như một cái gì đó xảy ra với tôi. Tất cả những gì tôi thực sự cần là một stati khác, trong đó ba giá trị đầu tiên là * không * được coi là bộ điều khiển, hành động hoặc id, nhưng chỉ có nhiều dữ liệu hơn và các giá trị actaul cho controller, action và id được lấy từ xa hơn trên route .... hmmm – Moo

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