2011-01-03 19 views
0

私はルートにパラメータを渡そうとしていますが、苦労しています。私は私のGlobal.asaxファイルに次きASP.NET MVC 3.0のルートとパッシングパラメータ

public ActionResult Detail(int id) 
     { 
      return View(); 
     } 

:私は、URLに「記事/ 230」と入力すると、以下のように、それは詳細アクションを呼び出す必要があることを望ん

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Articles", action = "Index", id = UrlParameter.Optional } // Parameter defaults 


      ); 

      routes.MapRoute(
       "ArticleDetails", // Route name 
       "Articles/{id}", // URL with parameters 
       new { controller = "Articles", action="Detail", id = 0 } // Parameter defaults 

      ); 

     } 

そして、

@foreach(var article in Model) 
{ 
    <div class="article_title"> 
    @Html.ActionLink(@article.Title, "Detail", "Articles", new { id = @article.Id}) 
    </div> 
    <div> 
    @article.Abstract 
    </div> 

答えて

2

ルートの順序は、定義されているのと同じ順序で評価されるため、重要です。だから、oimply順序を反転:あなたはArticles/123を要求したとき

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "ArticleDetails", 
     "Articles/{id}", 
     new { controller = "Articles", action = "Detail", id = 0 } 
    ); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Articles", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

今ではArticlesコントローラ上のDetailアクションを呼び出すとidパラメータとして123を渡します。

+0

ありがとうダーリン!それはうまくいったのですが、順序が重要で、元のコードではなぜ順不同であったにもかかわらず経路が一致しませんでしたか? – johndoe

+0

ルートエンジンは遅延マッチングに基づいて動作します。デフォルトルートは一致するものがないので(すべての値にデフォルト値があります)、それは他のものよりも前に一致します。 –

+1

経路情報を評価するための*何らかの順序が必要であるため、順序が重要です。 :)記事/ 123が存在しなかった「記事」コントローラの「123」アクションを呼び出そうとしたため、元の注文は機能しませんでした。最初の(デフォルトの)ルートと一致します。 – Sapph