2012-01-19 260 views
2

我有以下途徑:路由在MVC不工作

routes.MapRoute(
    "Property", 
    "{language}/property/{propertyUrlId}", 
    new { controller = "PropertyDetails", action = "Property" } 

這是一個應該被稱爲該路由控制器:

public class PropertyDetailsController : Controller 
{ 
    public ActionResult Property(string language, string propertyUrlId) 
    { 

而下面的網址應該使用該路線:

http://domain.com/en-us/property/3 

相反,我得到了404。任何想法爲什麼?


這裏是我的路線:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapRoute(
     "Property", 
     "property/{propertyUrlId}", 
     //new { controller = "PropertyDetails", action = "Property" }, new { language = @"[a-zA-Z]{2}-[a-zA-Z]{2}" } 
     new { controller = "PropertyDetails", action = "Property" } 
    ); 
} 

沒有用語言工作,或語言/國家,無論是。

+0

註冊路由規則的順序很重要。根據註冊順序向我們提供您創建的所有路線。 – Novakov 2012-01-19 01:15:11

+0

即使在建議的更改後,我仍然收到404。還有什麼我可以嘗試? – birdus 2012-01-19 01:54:33

+0

@AndrewBarber你的評論是不正確的。如果它與另一條路線相匹配,您將獲得404 mvc默認路由 - >控制器是未知的 - > 404 – santiagoIT 2012-01-19 03:06:39

回答

0

首先,沒有理由打破{}語言分開成在線路二塊。你們有些人說,這是好的:

routes.MapRoute(
    "Property", 
    "{language}/property/{propertyUrlId}", 
    new { controller = "PropertyDetails", action = "Property" } 

其次,我省略了一些信息,這是對這個問題的解決是至關重要的。在我的問題描述中沒有涉及到這一點,因爲我不知道有任何關係。 MVC項目在一個解決方案中,該解決方案還包含一個使用Sitecore CMS作爲其數據存儲的網站(非MVC)。 Sitecore正在剔除URL中的語言片段並存儲它自己。一旦我瞭解到發生這種情況,我就能夠處理這個問題。

我很欣賞所有的輸入,我對此感到抱歉。

2

使用「en-us」作爲URL的一部分是完全正確的。我想你也註冊了其他路線。試着把這條路線帶到其他地方,至少在默認路線的頂端。

我測試過這個場景,它對我來說工作得很好。

+0

你的意思是我不需要將en-us分成兩個參數?那麼我的問題似乎就在別的地方。這是我目前Global.asaxx中唯一的路線。 – birdus 2012-01-19 02:03:33

2

您很可能已在您的物業路線之前註冊了默認路線。默認路線通常如下所示:

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

只需在此默認路線註冊您的物業路線,它將工作。

爲什麼會失敗?(假設您確實註冊默認路由第一)

EN-US - >被解釋爲控制器

屬性 - >被解釋爲行動

既然你沒有EN-usController與一個屬性動作 - > 404

+0

@AndrewBarber 100%肯定。試試吧;-) – santiagoIT 2012-01-19 03:26:13

+0

我剛剛做到了。當預期的路線不是第一次時,我得到了一個404,並且在第一次時,我正確地調用了控制器動作。 +1 – 2012-01-19 03:30:11

+0

但是請注意,在評論superwalnut時,birdus說,問題中顯示的路線是* only *路線......所以默認路線甚至不存在(如果birdus是正確的) – 2012-01-19 03:34:03

0

考慮,你想擁有URL的結構爲:

http://domain.com/en-us/property/3 

我們E該路由:

routes.MapRoute(
      "Property", // Route name 
      "{language}/property/{propertyUrlId}", // URL with parameters 
      new { controller = "PropertyDetails", action = "Property", propertyUrlId = UrlParameter.Optional } // Parameter defaults 
     ); 

如果在您的Global.asax文件默認路由,就像這樣:

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

把routint的代碼塊以上。

而且你的控制器動作應該是這樣的:

所有的
public ActionResult Property(int propertyUrlId) 
{ 
return View(); 
}