Asp.net-Mvc

具有復雜路由的 ASP.Net MVC - 如何保持“理智”?

  • March 4, 2012

我有一個客戶希望按照以下方式使用 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/ 靜態部分來完成此操作,因為路由可以很容易地僅匹配值的數量,事實上我確實可以這樣做 - 但是,如果其中有一個靜態項目,我認為它更適合以後的管理確認路線的使用。

我希望這可以幫助別人!

引用自:https://stackoverflow.com/questions/9556831