web-dev-qa-db-ja.com

ASP.NET MVCUrl.Actionとルート名の値

私はasp.netmvc 2を使用しており、ルートに基づいてローカリゼーションを作成しています。

  1. 私のルートは次のようになります:{culture}/{controller}/{action}
  2. ホームコントローラーに移動します:en/Home/Index
  3. 私のホームコントローラービューには、他のコントローラーへのリンクがあります。

    <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));
    }
 }

すべての助けをありがとう

17
Sanja Melnichuk

URLを生成するときの最善のオプションは、常にルート名を使用することです。これにより、URLの生成に使用されるルートを選択するために使用されるアルゴリズムの微妙な点に触れることがなくなります。

Url.Actionを使用せず、代わりに Url.RouteUrl を使用する場合のアドバイスです。これにより、URLの作成に使用するルートの名前を指定できます。

常にルート名を使用することで、コードを変更に対してより堅牢にすることもできます。たとえば、URL生成のために既存のコードを壊す可能性があることを心配せずに、新しいルートを追加できます。

47
João Angelo

Url.Actionリンクを構築するために、Indexトークンのないidアクションは、Loginルートと一致します。ログインルートはSingleCultureMvcRouteHandlerを使用するため、カルチャはこれらのリンクの前に追加されません。

1
counsellorben