2017-04-15 37 views
2

在ASP.NET Core中,我想生成某種類型的SEO-URL,其中包含條目的ID以及其標題。自定義ASP.NET核心路由的ID和標題用連字符分隔

實施例:example.com/News/ViewNews/123-test-news

在Startup.cs予定義的以下路線

  routes.MapRoute(
       name: "SeoNews", 
       template: "{controller=News}/{action=ViewNews}/{id:int}-{title}" 
      ); 

在新聞 - 控制器,下面的動作存在

 public IActionResult ViewNews(int id, string title) { } 

裏面的斷點給了我空值,所以id = 0和title = null。

調用

例子:example.com/News/ViewNews/123

給我的ID = 123,但空標題的原因是不存在的URL。我的重寫路線有什麼問題?

其他途徑,我以後我的自定義路由定義

  routes.MapRoute(
       name: "AreaRoute", 
       template: "{area:exists}/{controller=Home}/{action=Index}/{id?}" 
      ); 

      routes.MapRoute(
       name: "DefaultMVCRoute", 
       template: "{controller=Dashboard}/{action=Index}/{id?}" 
      ); 

編輯 我試圖像這樣做一個斜線替換連字符,所以路由模板{controller=News}/{action=ViewNews}/{id:int}/{title}。這工作完美..不明白爲什麼。我已經試圖擺脫連字符,因爲它可能會衝突爲正則表達式中的特殊字符,這不起作用。

使用斜槓作爲分隔符對我來說是一個可行的解決方法。但是我很想知道這個字符上有什麼特別之處,它不起作用,所以我重命名了問題標題。

+0

你加這個默認路由上面? – Webbanditten

+0

是的,我在自定義之後定義了區域和默認MVC路線,並在第一篇文章中添加了他們的代碼。 – Lion

+0

如果您嘗試'example.com/News/ViewNews/123-testnews' url,它會如何表現? –

回答

0

我想你的意思是slu instead而不是標題?標題意味着你想用它作爲參數。只有爲了具有更多可描述的URL而使用slug,但實際上並未實際使用該路由。

此案例已在「Routing in ASP.NET Core」文章中的ASP.NET Core文檔中有詳細記錄。

您可以使用*字符作爲路由參數的前綴來綁定到URI的其餘部分 - 這稱爲catch-all參數。例如,blog/{*slug}將匹配以/blog開頭的任何URI,並且後面有任何值(將分配給slug路由值)。 Catch-all參數也可以匹配空字符串。

routes.MapRoute(
     name: "SeoNews", 
      template: "{controller=News}/{action=ViewNews}/{id:int}/{*slug}" 
     ); 

原因之一{controller=News}/{action=ViewNews}/{id:int}-{title}不工作是title不可選。其次是它試圖匹配斜線之間的整個模式,所以每個線段只能有一個參數。

你也可以試試這個,但我懷疑它會工作

routes.MapRoute(
     name: "SeoNews", 
      template: "{controller=News}/{action=ViewNews}/{id:int}{*slug}" 
     );