複数のパラメーターを取るルートがある場合、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
誰が私が間違っているのかを見ることができますか?
完全に満たされた最初のルートを使用しています。 SlugsAfterId
ルートの上にDefault
ルートを配置してみてください。
基本的に、「デフォルトをチェックします。アクションを取得しましたか?はい。IDを取得しましたか?はい。これを使用して、クエリ文字列の他のパラメータをチャックします。」
副次的な注意事項として、Default
パラメーターのデフォルト値を指定すると、slug
ルートが冗長になります。
「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 = "" }
);