私はasp.netmvc 2を使用しており、ルートに基づいてローカリゼーションを作成しています。
{culture}/{controller}/{action}
en/Home/Index
私のホームコントローラービューには、他のコントローラーへのリンクがあります。
<a href='<%= Url.Action("Prods","Products") %>' >Products</a>
<a href='<%= Url.Action("Index","About") %>' >About</a>
最初のリンク生成コード:/en/Products/Prods
が、2番目のリンク生成コード:/Home/Index
引数アクションで値Index
を渡すときに、Url.Action
が{culture}
ルートパラメータをスキップする理由がわかりませんか?私は何が間違っているのですか?
ルート構成:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Login", // Route name
"{controller}/Index", // URL with parameters
new { controller = "Login", action = "Index" } // Parameter defaults
).RouteHandler = new SingleCultureMvcRouteHandler();
routes.MapRoute("Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
次に
foreach (Route r in routes)
{
if (!(r.RouteHandler is SingleCultureMvcRouteHandler))
{
r.RouteHandler = new MultiCultureMvcRouteHandler();
r.Url = "{culture}/" + r.Url;
if (r.Defaults == null)
{
r.Defaults = new RouteValueDictionary();
}
r.Defaults.Add("culture", "en");
if (r.Constraints == null)
{
r.Constraints = new RouteValueDictionary();
}
r.Constraints.Add("culture", new CultureConstraint(cultures));
}
}
すべての助けをありがとう
URLを生成するときの最善のオプションは、常にルート名を使用することです。これにより、URLの生成に使用されるルートを選択するために使用されるアルゴリズムの微妙な点に触れることがなくなります。
Url.Action
を使用せず、代わりに Url.RouteUrl
を使用する場合のアドバイスです。これにより、URLの作成に使用するルートの名前を指定できます。
常にルート名を使用することで、コードを変更に対してより堅牢にすることもできます。たとえば、URL生成のために既存のコードを壊す可能性があることを心配せずに、新しいルートを追加できます。
Url.Actionリンクを構築するために、Index
トークンのないid
アクションは、Login
ルートと一致します。ログインルートはSingleCultureMvcRouteHandlerを使用するため、カルチャはこれらのリンクの前に追加されません。