web-dev-qa-db-ja.com

複数のルート値を使用したASP.NET MVC URLルーティング

複数のパラメーターを取るルートがある場合、Html.ActionLinkで問題が発生します。たとえば、Global.asaxファイルで次のルートが定義されている場合:

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.mvc/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

routes.MapRoute(
    "Tagging",
    "{controller}.mvc/{action}/{tags}",
    new { controller = "Products", action = "Index", tags = "" }
);

routes.MapRoute(
    "SlugsAfterId",
    "{controller}.mvc/{action}/{id}/{slug}",
    new { controller = "Products", action = "Browse", id = "", slug = "" }
);

最初の2つのルートは問題なく機能しますが、次を使用して3番目のルートへのアクションリンクを作成しようとすると:

<%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %>

[site-root]/Details/1?slug = url-slugのようなURLになりますが、URLは[site-root]/Detailsのようにしたいのですが/ 1/url-slug

誰が私が間違っているのかを見ることができますか?

50
Ian Oxley

完全に満たされた最初のルートを使用しています。 SlugsAfterIdルートの上にDefaultルートを配置してみてください。

基本的に、「デフォルトをチェックします。アクションを取得しましたか?はい。IDを取得しましたか?はい。これを使用して、クエリ文字列の他のパラメータをチャックします。」

副次的な注意事項として、Defaultパラメーターのデフォルト値を指定すると、slugルートが冗長になります。

60
Garry Shutler

Garry(上記)は正しいです。 MVCにはMr. Haackのルートデバッガーを使用できます。どのルートがいつヒットしたかを示すことにより、ルーティングの問題の解決に役立ちます。

これが ブログ投稿 です。そして、これが Zipファイル です。

32
MunkiPhD

「id」を含むルートに制約を追加できます。これは、おそらく数字を受け入れるだけだからです。この方法では、「id」が数値の場合にのみ最初のルートが一致し、他のすべての値に対して2番目のルートが作成されます。次に、{slug}を含むものを上部に配置すると、すべてが正常に機能するはずです。

routes.MapRoute(
    "SlugsAfterId",
    "{controller}.mvc/{action}/{id}/{slug}",
    new { controller = "Products", action = "Browse", id = "", slug = "" },
    new { id = @"\d+" }
);

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.mvc/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" },  // Parameter defaults
    new { id = @"\d+" }
);

routes.MapRoute(
    "Tagging",
    "{controller}.mvc/{action}/{tags}",
    new { controller = "Products", action = "Index", tags = "" }
);
8