2011-07-25 73 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); 
} 

例如,對於英語的「關於我們」頁面,西班牙語版本通過以下網址可用: http://localhost/en/Page/ChangeCulture?lang=2&returnUrl=/es/Page/AboutUs

的問題是,這個URL映射到我已經路線爲顯然不存在的CMS頁面定義。有沒有辦法可以忽略URL「Page/ChangeCulture」,以便映射到正確的方法,即在「基本控制器」中定義的方法?

感謝,

何塞

回答

0

您可以嘗試在名稱參數設置route constraint

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

這工作完美 - 謝謝。 – jose

0

您應該重新構建您的網址。爲什麼關於我們頁面的西班牙語版本在不同的URL中提供?在您的例子:

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

請與一致的URL每一種語言的每一頁的工作(在這個例子中,第二個)。 那麼你的路由會是什麼樣子:

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 /關於我們(西班牙語)和http:// localhost/en/Page/AboutUs(英文)。 – jose