2017-02-02 17 views
2

私の要件は、同じコントローラ/アクションメソッドに複数のルートを設定する必要があるということです。ASP.NET MVC 5のルート

ユーザがURL http://localhost:xxxx/home/indexを入力すると、「ホーム」コントローラの「インデックス」アクションメソッドをターゲットにします。

また、「http://localhost:xxxx/products」と「http://localhost:xxxx/categories」は、「ホーム」コントローラの「インデックス」アクションメソッドを指しているようにします。

「カテゴリ」と「製品」の2つのルートを追加することで、これを実現できました。これはうまくいきます。

routes.MapRoute(
     name: "categories", 
     url: "categories", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

    routes.MapRoute(
     name: "products", 
     url: "products", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 


    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 

私の質問は、これら2つのルート「カテゴリ」と「製品」を1つに結合する方法はありますか?

+2

短い答え:いいえ(あなたが '{ID}は'第2の経路に、あなたにも 'ID = UrlParameter.Optional'を除去することができるためのセグメントを持っていないので) 。あなたは経路制約を作成できると言っていたが、おそらくその価値はない。 –

+1

経路属性の正規表現フィルタは、あなたの友人かもしれません。私はそれと非常によく似たことをすることができました。いくつかの情報はここにあります:http://stackoverflow.com/questions/25077406/regex-in-route-attribute-restful-api-asp-net-web-api –

+0

あなたが属性のルーティングに行くことができるなら、それはきれいでしょう。実際にそれを組み合わせる)[ルート( "Home/Index")] [ルート( "製品")] [ルート(カテゴリ)] public ActionResult Index() { return View(); } ' – Developer

答えて

2

これは、経路に制約を追加することで実現できます。

パス全体をパラメータにしてから、このパラメータに一致する正規表現ルールを割り当てます。

routes.MapRoute(
    name: "IndexMapper", 
    url: "{alternateIndexName}", 
    defaults: new { controller="Home", action="Index" }, 
    constraints: new { alternateIndexName="(categories)|(products)"} 
); 

https://msdn.microsoft.com/en-us/library/cc668201.aspx#Anchor_6