2011-07-25 13 views
0

私は多言語のMVCアプリケーションを使用しています。これには、ページコントローラによって処理される単純な「CMS」ページがいくつかあります。私が定義したルートは、次のとおりです。MVCのルートコンフリクトの問題

routes.MapRoute(
    "Page", 
    "Page/{name}", 
    new { controller = "Page", action = "Index", name = "" } 
); 

また、私は、現在のページの言語を変更するために使用される「ベースコントローラ」で定義されたメソッドを持っています。例えば

public ActionResult ChangeCulture(Culture lang, string returnUrl) 
{ 
    if (returnUrl.Length >= 3) 
    { 
     returnUrl = returnUrl.Substring(3); 
    } 

    return Redirect("/" + lang.ToString() + returnUrl); 
} 

、英語、スペイン語版の「お問い合わせ」ページには、次のURLを経由して提供されていますのために: http://localhost/en/Page/ChangeCulture?lang=2&returnUrl=/es/Page/AboutUs

問題は、私がきたルートにこのURLがマップということです明らかに存在しないCMSページ用に定義されています。 URL「ページ/チェンジカルチャー」を無視できる方法はありますか?つまり、「ベースコントローラー」で定義されている正しい方法にマップされていますか?

おかげで、

ホセ

答えて

0

は、名前のパラメータにroute constraintを設定してみてくださいすることができます。

routes.MapRoute(
       "Page", 
       "Page/{name}", 
       new { controller = "Page", action = "Index", name = "" }, 
       new { name = new PageNameConstraint() } 
       ); 
+0

これは完全に機能しました - ありがとう。 – jose

0

URLを再構築する必要があります。 About Usページのスペイン語版が異なるURLで提供されるのはなぜですか?あなたの例では:

  1. http://localhost/en/Page/ChangeCulture?lang=2&returnUrl=/es/Page/AboutUs
  2. http://localhost/es/Page/AboutUs

一貫したURLを持つすべての言語のすべてのページの作品(この例では、第二1)してください。 あなたルーティングは、次のようになります。

routes.MapRoute(
    "Page", 
    "{lang}/Page/{name}", 
    new { controller = "Page", lang = "en", action = "Index", name = "" } 
); 

あなたもRedirectToactionの代わりRedirectを呼び出し、URLを構築するより堅牢なフォームを使用することができます。例えば:

RedirectToAction("Index", new { page = "AboutUS", lang = "es" }); 
+0

私が追加したURLは、メソッド "ChangeCulture"と同じ名前のページに混乱があることを示すことに過ぎません。 http:// localhost/es/Page/AboutUs(スペイン語)およびhttp:// localhost/en/Page/AboutUs(英語)は、「About Us」ページのリンクです。 – jose