2017-09-22 105 views
1

我已經設置了以下的路徑,在我的MVC項目:MVC路由投擲404

  routes.MapRoute(
       "Product", 
       "product-{pathname}-{productId}", 
       new { controller = "Product", action = "ProductPage" }); 

這工作得很好像product-test-title-1234網址,但如果pathname位的URL包含product-,404被拋出 - 是有一種方法可以允許像product-test-product-title-1234這樣的網址?

古怪,如果我把第二個產品只是產品ID之前(如product-test-title-product-12345),那麼路徑工程和頁面顯示,其他任何地方,它拋出一個404

更新

我認爲問題可能在於URL的兩部分與路由匹配這一事實,所以我想我的問題是如何確保路由表明第一個產品必須位於url的開頭(並計算任何更多的實例產品作爲路徑名的一部分)。

進一步測試後,我發現,而不是去到產品的控制器,這個網址去我包羅萬象的路線:{*pathname} - 不知道爲什麼會這樣

+0

爲什麼用'-'(連字符)? - 代替'product/{pathname}/{productId}'生成'../ product/test/product-title-1234' –

+0

@StephenMuecke不幸的是它是當前網站的路徑,我們需要保持它不變所以我們不必爲所有的舊網址實施301個永久物(否則當新的網站替換舊的時候,我們將在seo上受到懲罰)。另外這也是市場部門想要的 - 我也會用通常的'/'結構,但顯然淺的url結構對於seo排名也更好 – Pete

回答

0

有沒有一種方法可以讓一個網址像產品測試產品標題1234?

是的,但你所定義的路徑URL包括3個破折號和URL你是匹配包含4您可以使用像匹配的網址:

 routes.MapRoute(
      "Product", 
      "product-{pathname}-product-{productId}", 
      new { controller = "Product", action = "ProductPage" }); 

但是這可能不是什麼你正在尋找。這裏的問題是,當您使用-作爲路由佔位符之間的分隔符時,佔位符本身不能包含-,否則Route類會感到困惑。

但是,如果您下降到較低級別並繼承RouteBase,則路由非常靈活,這可能更符合您所尋找的內容。然後,您可以將所需的任何自定義邏輯/ URL添加到路由中,即使組織結構不完善,也可以完全匹配舊的URL方案。

請參閱:Multiple levels in MVC custom routing

+0

嗨,Nightowl,謝謝你的回答,不幸的是這不會工作,因爲它不會沒有真正解決任何問題 - 在產品ID旁邊有產品的路徑已經運行(參見上面問題的最後一句),而且我不想包含第二個路徑名(即,我不想要類似'product- {路徑名} -product- {pathname1} - {productId}'),因爲我需要整個路徑名位以從無頭cms系統獲取頁面數據 – Pete

+0

如果您希望它轉到CMS系統,請參閱我提供的鏈接。使用'MapRoute'不適用於每種情況,但是如果您繼承'RouteBase',則可以按照您喜歡的任何方式從字面上對路由進行編程。 – NightOwl888