2016-09-21 1 views
3

私は現在、小さなASP.NET MVCプロジェクトに取り組んでいます。このプロジェクトは数ヶ月前にリリースされました。しかし、ユーザビリティとSEOの理由から、変更を実装する必要があります。私はクリーンURLを作成するために属性ルーティングを使用することに決めました。製品ページがで呼び出された瞬間に複数のルートが1つの方法に割り当てられ、どのルートが呼び出されたかを判断する方法は?

hostname.tld /コントローラ/ GetArticle/1234

は、私はこのような新しいルートを定義しました。

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

すべて正常に動作しますが、下位互換性とSEOの理由から、古いルートはまだ利用可能でなければなりません。 HTTPステータスコード301で新しいURLにリダイレクトされました。

私はこのように、1つのアクションに複数のルートを割り当てることが可能であることを聞いた:

[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と思うので、私が知る限り、複数のルートタグは以前のバージョンではサポートされていません。そして、私はこれをチェックしていただきありがとうございます! –

+0

コアMVCを使用していた場合、依存関係インジェクションを使用して、「ControllerContext」と同等のものを取得する必要があるからです。 –

答えて

5

1つの操作に複数のルートを使用する場合は、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

ありがとう、これは私の問題を解決! –

関連する問題