2012-06-13 41 views
4

我有一些問題,我在ASP.NET MVC3應用路由,正是因爲我想它不工作。在Global.asax中如何解決我的MVC3路由

路由定義

routes.MapRoute(
      "News", // Route name 
      "{lang}/{controller}/{action}/{page}/{id}", // URL with parameters 
      new { lang = "pl", controller = "News", action = "Index", page = 1, id = UrlParameter.Optional } // Parameter defaults 
     ); 

所以我想用它在2情況:

  1. /{lang}/{controller}/{action}/{page} - 轉到特定paginations頁面
  2. /{lang}/{controller}/{action}/{page}/{id} - 記當前頁面,並轉到具有特定id的頁面。

產生鏈接我用:

@Html.RouteLink(i.ToString(), "News", new { lang = ViewBag.Lang, page = i }) 

其中i是頁面的數量,並且lang是語言。

控制器我處理它巫行動

public ViewResult Index(string lang, int page = 1) 

問題

@Html.RouteLink(當 '2' 是點擊的),但我的控制器不處理給我鏈接/pl/News/Index/2它和頁面仍然是'1'。所以,當我點擊相同的鏈接兩次,它給:/pl/News/Index/2/2,然後頁面等於'2'。

如果有人能解釋我如何準確工作,我能做些什麼來解決呢?

任何幫助,將不勝感激。

+0

這是一些邪惡的途徑,但我在你的控制器中沒有看到'id'(這是可選的),不應該是'Index(string lang,int?id,int page = 1)'? :) –

+0

你不仔細閱讀:)在索引操作中,我不使用'id'參數,我只需要在其他操作。 –

+1

如果我理解正確,點擊'/ pl/News/Index/2',它會觸發正確的_Index_動作,但是此動作中_page_的值是1而不是2。是否還有其他路線可以匹配鏈接? –

回答

2

我猜你錯過了這裏是路由系統使用的變量值從當前請求生成出站規則。

例如 - 如果你在頁/ PL /新聞/索引/ 2,你有

lang = "pl", controller = "News", action = "Index", page = 2 

如果試圖生成這樣

@Html.RouteLink(i.ToString(), "News") 

路由系統的規則將使用已存在的變量,如lang,並將生成完全相同的URL -/pl/News/Index/2。

當然,您在Html.RouteLink中以匿名類型傳遞的值將被優先處理,並將覆蓋當前請求中的值。因此,在您的示例中,您應該考慮當您生成鏈接時,您處於什麼URL。

優先順序是:

  1. 變量在匿名類型傳遞
  2. 請求變量在路徑定義
  3. 默認值。

看來,這部分

lang = ViewBag.Lang 

是無用的,因爲將從請求採取的,如果你不提供它 - 所以它會被保留。

更新(可能不相關):

你也應該記住,如果你有一個規則,一個以上的比賽 - 路由系統會選擇第一一個滿足約束條件(從請求的示例值不應與默認變量衝突)

UPDATE2

路由系統使用請求變量上升到第顯式指定變量(通過匿名類型),所以如果你指定明確 - 不請求變量將被重用(在你的情況,因爲是在您的網址第一段)

+0

感謝您的回答,但我不確定我是否瞭解您。你建議我改變一下嗎?另外當我使用'@ Html.RouteLink'並給出具體的路由名稱時,它正在採取正確的規則,不是嗎?但是我發現它不會覆蓋'page'值。但我必須做什麼,它是這樣做的? –

+0

@MateuszRogulski - 當您使用RouteLink時,它使用指定的規則(這就是爲什麼我提到我的更新與您的案例無關)。你可以發佈整個代碼(所有規則,所有操作和完整的視圖) - 我剛剛嘗試了一個新的MVC項目的規則,它工作正常(頁面值被覆蓋) – Bond

+0

它採取錯誤的路由規則。但在這種情況下,我不知道'@ Html.RouteLink'是如何工作的,因爲它獲得了'Default'路由。但我通過改變我的路線規則來解決它。感謝幫助。 –

0

我覺得屬於你問題在於你打破了約定,而且由於MVC依賴於約定來成功路由,所以你的映射有點破壞。

我建議重寫你的路由,像這樣:

​​

這似乎是一個URL的最常見的情況是這樣的:

http://yourdomainhere/news/pl/some-sort-of-permalink/1 
+0

謝謝,但沒有什麼能解決我的問題。 –