2016-09-21 51 views
3

我正在研究一個小型的ASP.NET MVC項目。該項目幾個月前發佈。但是現在應該對可用性和SEO的原因進行更改。我決定使用屬性路由來創建乾淨的URL。分配給一個方法的多個路由,如何確定哪個路由被調用?

目前產品頁面被稱爲:

hostname.tld /控制器/ GetArticle/1234

我定義了一個新的路線是這樣的:

[Route("Shop/Article/{id:int}/{title?}", Name = "GetArticle", Order = 0)] 
public ActionResult GetArticle(int id, string title = null) { 
    // Logic 
} 

一切正常,但由於向後兼容性和搜索引擎優化的原因,舊的路線應該仍然可用。並將HTTP狀態碼301重定向到新的URL。

我聽說有可能多個路由分配到一個動作,就像這樣:

[Route("Shop/Article/{id:int}/{title?}", Name = "GetArticle", Order = 0)] 
[Route("Controller/GetArticle/{id:int}", Name = "GetArticle_Old", Order = 1)] 
public ActionResult GetArticle(int id, string title = null) { 
    // Logic 
} 

但我不知道這是否是一個很好的解決方案或如何確定哪條路線被稱爲?

+0

您正在使用哪個版本的MVC?您可能通過'this.ControllerContext.RouteData'獲取路線信息。 –

+0

ASP.NET MVC 4.5.2,所以我認爲MVC 5,多個Route標籤在早期版本上不被支持,據我所知。謝謝你,我會檢查一下! –

+0

我問過,因爲如果你使用的是Core MVC,你需要使用依賴注入來獲得相當於'ControllerContext'我相信。 –

回答

5

您可以查看ControllerContext.RouteData以確定在使用多個路線執行一個操作時使用哪條路線。

public const string MultiARoute = "multiA/{routesuffix}"; 
public const string MultiBRoute = "multiB/subB/{routesuffix}"; 

[Route(MultiARoute)] 
[Route(MultiBRoute)] 
public ActionResult MultiRoute(string routeSuffix) 
{ 

    var route = this.ControllerContext.RouteData.Route as Route; 
    string whatAmI = string.Empty; 

    if (route.Url == MultiARoute) 
    { 
     whatAmI = "A"; 
    } 
    else 
    { 
     whatAmI = "B"; 
    } 
    return View(); 
} 
+0

謝謝,這解決了我的問題! –

相關問題