2012-03-04 21 views
8

我有一個客戶,誰希望使用的線沿線的一個URL命名約定:複雜路由的ASP.Net MVC - 如何保持它「理智」?

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

這很好 - 這出色的作品,每個主題區一個控制器,並帶有ID之後的動作(視)完全沒有問題。

然而,然後變得複雜,作爲客戶端,然後要進一步繼續層次:

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

我對緊密相關學科控制器(它只是另一個主題區)負責處理所有的管理員方面,但客戶堅持讓公衆的觀點遠離父主題而不是自己的根。

我該如何做到這一點,同時避免打破MVC的整體原則,也避免重新實現大量ASP.Net MVC提供的功能在我的主題區域控制器中,以便能夠處理相同的主題控制器?

是否有可能以某種方式從父主體控制器中調用相關主體控制器,並返回結果視圖(因爲這會使主體的功能與其控制器分離)?如果可能的話,這將解決許多問題。你可以做到這一點

回答

2

這裏是解決我的問題的解決方案 - 希望它能解決別人的問題。

正如我在給羅伯特哈維的評論中所提到的,我實際上需要的是另一條路線,它不使用前兩個或三個組件作爲控制器,動作和標識,而是從後來取這些值 - 如果你把這個靜態值掛在路由上,它更容易做到。

所以,這裏是我決定簡化路由的網址:

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

滿足該URL的路線如下:

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

在隨後的控制器動作,我可以爲parentcontroller和parentsubject請求參數值,這樣我就可以過濾掉相關的項目,只針對給定的父主題 - 解決問題!

此路線需要高於剛處理前兩個值的路線,否則您將冒另一個路線圖劫持請求的風險。

我完全可以在沒有/ related/static部分的情況下完成此操作,因爲路由可以輕鬆地與單個值的數目匹配,事實上我確實可以這麼做 - 但是,如果存在靜態在那裏確認使用路線。

我希望這可以幫助別人!

+0

這也正是我以前使用新的視圖控制器,但保持對父控制器和父參數的訪問。感謝您發佈您的調查結果。 – 2012-04-21 02:09:12

1

的一種方法是指定一個通配符路徑(注意星號):

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

這使得控制器到action後收到的整個路徑字符串。

然後,您可以獲取的對象層次的控制器方法如下所示:

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

一旦你有,你可以做任何你想要的,包括派遣不同的主題,以不同的處理方法進行處理。

+0

這就是我在發佈問題之前考慮的方式 - 但是,它具有拋出ASP.Net MVC提供的大部分內容的副作用,因爲有很多「路由」,然後我需要做的在控制器方法內處理動作 - 這正是我試圖避免的。如果我能挑出相關的主題控制器值,action和id,那麼我可以將所有內容都留給目標控制器,而不必重新實現當前控制器上的所有內容(這也會違反單一責任原則)。那有意義嗎? – Moo 2012-03-04 17:47:06

+0

它的價值指出,問題不在於如何從路線獲取值,如何從正確的控制器獲取結果視圖,而在不同的控制器中 - 如果有可能做到這一點....和我隨着某些事情發生在我的思想中,我們就開始思考。我真正需要的是另外一個站點,其中前三個值是*不被認爲是控制器,動作或ID,但是更多的數據和控制器,動作和ID的actaul值取自進一步下行的路線.... hmmm – Moo 2012-03-04 17:52:17