2012-02-19 2 views
1

ASP MVC 3プロジェクトでは、言語切り替えを有効にする必要があります。ActionLinkを使用したASP MVC 3スイッチング言語

ルーティングは、次のように定義されていますした後(代わりに次のようなURLを取得する

<li>@Html.ActionLink("Spanish", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { language = "es" })</li>  

:(_Layout.cshtmlで)言語を切り替えるしようと

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "DefaultWithLanguage", // Route name 
      "{language}/{controller}/{id}/{slug}", // URL with parameters 
      new { language = "en", controller = "Front", action = "Details", id = UrlParameter.Optional, slug = UrlParameter.Optional } // Parameter defaults     
     ); 

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

このように動作しますスペイン語を選択しました)

私はこれを得ています:

.../ControllerName/ActionName?Length=11 

私は(最後のヌルパラメータに注目してください)以下にActionLinkのを設定した場合:

<li>@Html.ActionLink("Spanish", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { language = "es" }, null)</li> 

を私はこれを取得:

.../ControllerName/ActionName?language=es 

私は何をしないのですか? ありがとうございます!

+0

デフォルトルートのままにしましたか?すべてのルート登録を表示してください。 –

+0

@ダリン(変更された)配合を見てください。 RegisterRoutesにすべてのコードを含めました。 –

答えて

1

ルート登録にはいくつか問題があります。DefaultWithLanguageルート登録。 {action}を指定することはできません。つまり、このルートはDetailsアクションにのみ一致します(デフォルト値で指定されているため)。もう1つの問題は、{id}パラメータをオプションにしたことです。しかし、それは不可能です。 最後のルートのパラメータはオプションである場合があります。あなたの場合は、{slug}パラメータが続きます。

だから、一つの可能​​性は次のようになりません:

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

    routes.MapRoute(
     "DefaultWithLanguage", 
     "{language}/{controller}/{action}/{id}", 
     new 
     { 
      language = "en", 
      controller = "Front", 
      action = "Details", 
      id = UrlParameter.Optional 
     } 
    ); 
} 

、その後:

@Html.ActionLink(
    "Spanish", 
    ViewContext.RouteData.GetRequiredString("action"), 
    ViewContext.RouteData.GetRequiredString("controller"), 
    new { language = "es" }, 
    null 
) 

あなたが{slug}パラメータを追加したい場合は、あなたの{id}は、もはやオプションを指定できます

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

    routes.MapRoute(
     "DefaultWithLanguage", 
     "{language}/{controller}/{action}/{id}/{slug}", 
     new 
     { 
      language = "en", 
      controller = "Front", 
      action = "Details", 
      slug = UrlParameter.Optional 
     } 
    ); 
} 

、次に:

@Html.ActionLink(
    "Spanish", 
    ViewContext.RouteData.GetRequiredString("action"), 
    ViewContext.RouteData.GetRequiredString("controller"), 
    new { 
     language = "es", 
     id = ViewContext.RouteData.GetRequiredString("id") 
    }, 
    null 
) 
+0

今私は見る!あなたが正しい!説明をありがとう!私はこれを試してみましょう! –

0

これはDarinの答えに対するフォローアップです。私はこのようなルートを持ちたい

.../en/ControllerName/Id 
.../en/ControllerName/Id/Slug 
.../en/ControllerName 

この最後のルートは(ダーリンの答えを参照)という問題が生じます。このルートを取得維持する「ハック」はまた、他の経路(DefaultWithLanguageWithoutId命名秒)を定義することである。

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

      routes.MapRoute(
       "DefaultWithLanguage", // Route name 
       "{language}/{controller}/{id}/{slug}", // URL with parameters 
       new { language = "en", controller = "Front", action = "Details", id = UrlParameter.Optional, slug = UrlParameter.Optional } // Parameter defaults             
      ); 

      routes.MapRoute(
       "DefaultWithLanguageWithoutId", // Route name 
       "{language}/{controller}", // URL with parameters 
       new { language = "en", controller = "Front", action = "Details"} // Parameter defaults     

      ); 

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

これは、以下

<li>@Html.ActionLink("Deutsch", ViewContext.RouteData.Values["action"].ToString() 
, ViewContext.RouteData.Values["controller"].ToString(), new { language = "de" 
, id = ViewContext.RouteData.Values["id"]!=null ? ViewContext.RouteData.Values["id"].ToString():null }, null)</li> 
    <li>@Html.ActionLink("English", ViewContext.RouteData.Values["action"].ToString() 
, ViewContext.RouteData.Values["controller"].ToString(), new { language = "en" 
, id = ViewContext.RouteData.Values["id"] != null ? ViewContext.RouteData.Values["id"].ToString() : null }, null)</li> 
にマスターページに調整するためのコードを引き起こしています

完璧に動作します!

唯一の「欠点」は、いくつかのコードが含まれているということです(私は避けたいと思っていましたが)。しかし、それはとても簡単なので価値があると思います!

関連する問題