Asp.net-Mvc
具有復雜路由的 ASP.Net MVC - 如何保持“理智”?
我有一個客戶希望按照以下方式使用 URL 命名約定:
/{subjectarea}/{subject}/{action}這很好 - 這非常有效,每個主題區域有一個控制器,並且在 id(主題)之後執行操作完全沒有問題。
但是,它會變得複雜,因為客戶端想要進一步繼續層次結構:
/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction}我有一個用於處理所有管理方面的緊密相關主題(它只是另一個主題區域)的控制器,但客戶端堅持讓公共視圖掛在父主題而不是它自己的根。
我怎樣才能做到這一點,同時避免破壞 MVC 的整個原則,並避免在我的主題區域控制器中重新實現大量 ASP.Net MVC 提供的功能,以便能夠處理來自同一控制器的相關主題?
是否可以從父主題控制器中以某種方式呼叫相關主題控制器,並返回結果視圖(因為這會將主題的功能分離到他們自己的控制器)?如果這是可能的,它將解決很多問題。
這是解決我給定問題的解決方案-希望它可以解決其他人。
正如我在對 Robert Harvey 的評論中所提到的,我真正需要的是另一條路線,它不使用前兩個或三個組件作為控制器、動作和 id,而是從稍後獲取這些值 - 如果你把它掛在路由中的靜態值也是如此,它更容易做到。
所以,這是我決定簡化路線的網址:
/{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/ 靜態部分來完成此操作,因為路由可以很容易地僅匹配值的數量,事實上我確實可以這樣做 - 但是,如果其中有一個靜態項目,我認為它更適合以後的管理確認路線的使用。
我希望這可以幫助別人!