2012-01-24 16 views
0

をルーティング私はコントローラーのasp.net MVCと

で、次のアクション ​​

を持っていると私は、次のルートを持つようにしたい:

~/article/ -> Action = Index, pageNumber = 1 
~/article/page-5 -> Action = Index, pageNumber = 5 
~/article/page-1 -> ~/article/ 
~/article/foo -> Action = Details, seoFriendlyName = foo 

私は、次のルートを定義しようとしたが、しかし、それは動作しません:

routes.MapRoute(
       null, 
       "article/page-{pageNumber}", 
       new { controller = "MyController", action = "Index", pageNumber = 1 }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article", 
       new { controller = "MyController", action = "Index", }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article/{seoFriendlyName}", 
       new { controller = "MyController", action = "Details", }, 
       new[] { "MyNamespace" } 
); 

ご協力いただければ幸いです!

答えて

2

あなたの要件は自己矛盾しています。たとえば、seoFriendlyName == "page-6"と実際のpageNumber == 2の記事がある場合、どのルートを選択する必要がありますか?

私はあなたが

~/article/ -> Action = Index, pageNumber = 1 
~/article/page/5 -> Action = Index, pageNumber = 5 
~/article/page/1 -> ~/article/ 
~/article/foo -> Action = Details, seoFriendlyName = foo 

にあなたの要件を変更することをお勧めしたいと、あなたは、次のルートがあります。コメントに応えて

routes.MapRoute(
       null, 
       "article/page/{pageNumber}", 
       new { controller = "MyController", action = "Index", pageNumber = 1 }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article", 
       new { controller = "MyController", action = "Index", }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article/{seoFriendlyName}", 
       new { controller = "MyController", action = "Details", }, 
       new[] { "MyNamespace" } 
); 

UPDATE

をそのためには

が必要ですあなたのルートを次のように変更する必要があります:

routes.MapRoute(
       null, 
       "article", 
       new { controller = "MyController", action = "Index", pageNumber = 1 }, 
       new[] { "MyNamespace" } 
); 

routes.MapRoute(
       null, 
       "article/page/{pageNumber}", 
       new { controller = "MyController", action = "Index", }, 
       new[] { "MyNamespace" } 
); 


routes.MapRoute(
       null, 
       "article/{seoFriendlyName}", 
       new { controller = "MyController", action = "Details", }, 
       new[] { "MyNamespace" } 
); 
+0

私は 'Url.Action( "インデックス"、 "MyController")を呼び出すと'そして '〜/記事/ page'は、代わりに'〜/ article'でレンダリングされます –

+0

これを '〜/ article'にしたい場合は、経路の順序を変更する必要があります。また、Janが提案したように、デフォルトのpageNumer設定を別のルートに移動する必要があります。私は一瞬で私の答えを更新します。 –

+0

答えを –

0

あなたは私たちに語ったことはありません。 私が見た唯一のことは、pageNumberパラメータに間違った値を設定したことです。

これは、より良い動作するはず:

routes.MapRoute(
    null, 
    "article", 
    new { controller = "MyController", action = "Index", pageNumber = 1 }, 
    new[] { "MyNamespace" } 
); 

routes.MapRoute(
    null, 
    "article/page-{pageNumber}", 
    new { controller = "MyController", action = "Index"}, 
    new[] { "MyNamespace" } 
); 

routes.MapRoute(
    null, 
    "article/{seoFriendlyName}", 
    new { controller = "MyController", action = "Details" }, 
    new[] { "MyNamespace" } 
); 
+0

あなたのサンプルでは、​​ '〜/ article/page-like 'としてレンダリングされる' Url.Action( "Index"、 "MyController"、新しい{pageNumber = 1} 1」とし、それを '〜/ article'としてレンダリングします。 –

+0

はい、ルートの順番を変更してください。 – Jan