2011-10-17 69 views
4

比方說我們有這樣的路線:MVC URL.RouteUrl刪除RouteValues但URL.Action保留呢?

routes.MapRoute(
"Library", 
"Lib/{id}/{lang}", 
New With {.controller = "MyLibrary", .action = "ShowItem", .id= 0, .lang = "en"} 
) 

而且可以說,我們要求這個網址

http://localhost/Lib/10/de 

所以現在我們有這個路由值id = 10 & lang = de

這裏的問題是:

此代碼:

<%= Url.Action("ShowItem", New With {.id = 45})%> 

回報:

http://localhost/Lib/45/de 

它改變ID但保留

但這代碼:

<%= Url.RouteUrl("Library", New With {.id = 45})%> 

回報:

http://localhost/Lib/45 

它改變ID但是移除

這是一個錯誤還是什麼?我知道如何解決這個問題,但這種不同的行爲非常混亂。我對嗎?或者只是想象這個?

一個快速的解決將是:

<%= Url.RouteUrl("Library", New With {.id = 45},.lang = RouteData.Values("lang"))%> 

回答

3

好的,所以理論上正確的預期mvc行爲在於它不應該重用當前請求中的變量,如果它們出現在比您指定的更晚的段中。所以我想知道你是否有一些其他路線定義爲你所描述的不完全正確,所以它可能會匹配其他東西。如果不是,它可能是一個錯誤。

無論如何,因爲上述行爲(當其工作!)相當混亂時,最好的做法是在創建鏈接時使用UrlParameter.Optional提供所有的段變量,如上所述。那麼你不必擔心這種模糊性。

對於什麼是值得的,你看到的第二個結果(即RouteUrl)是正確的行爲。該行動應該表現得一樣。

+0

感謝DanH的回答,對不起,我的回覆晚了。正如你所說,我認爲這是因爲其他路線。在David的回答和建議後,我創建了一個新項目,並發現每件事情都正常。我真的希望給你一部分獎金,但大衛的回答看起來更好。再次感謝&+1 –

+0

我要給大衛提供賞金點,並回答Dan。你們都幫了我很多。大衛的回答完成了,我發現問題是由於定義的路線。丹的回答確保了其他定義的路線導致了這個問題。 –

+0

非常公平的你謝謝! – DanH

1

貌似是預期的行動。 http://msdn.microsoft.com/en-us/library/dd492912.aspx表示「生成一個完全合格的URL指定的操作名稱和路由值的操作方法。」這意味着它將使用路由值填充其他字段?

只是猜測種類...

+0

否。它表示您傳遞給此方法的路由值。 http://msdn.microsoft.com/en-us/library/dd504960.aspx這個鏈接沒有提到routevalues,但它也會保留它們。 –

3

這是基本相同How to ignore current route values when generating links?

嘗試是這樣的:

<%= Url.Action("ShowItem", New With {.id = 45, .lang=UrlParameter.Optional})%> 

對不起,我不是太熟悉VB語法,所以它可能不是100%正確的,但關鍵是要通過UrlParameter.Optional所以也沒有保持路線價值。

更新:我想補充一點,你的行爲是不期望。從一個新的MVC應用程序,我加入ShowItem行動基本在MyLibrary控制器,與此代碼(抱歉,這是C#):

@Url.Action("ShowItem", new {id = 45})<br /> 
@Url.RouteUrl("Library", new {id = 45})<br /> 
@Url.Action("ShowItem", new {lang = "fr"})<br /> 
@Url.RouteUrl("Library", new { lang = "fr" })<br /> 

當我去到/ LIB/10/DE,它顯示:

/Lib/45 
/Lib/45 
/Lib/10/fr 
/Lib/10/fr 

所以注意:

  • 有兩種方法,如果在此之前沒有變化值
  • 當前路線值僅保留之間沒有區別在URL中。因此'10'被保留,但'de'不是。

我不知道爲什麼你看到不同的東西,但我建議從一個乾淨的應用程序進行測試,以隔離應用程序中可能發生的其他事情。

+0

嗯,我的問題是:爲什麼在這兩種方法中有兩種不同的行爲?順便說一句,在我的項目中,我所期望的路線是按照你所說的定義的,使用:UrlParameter.Optional,它是一樣的行爲。 –

+0

我說的是將UrlParameter.Optional傳遞給Url.Action,而不是在設置路線時。這是完全不同的事情。 –

+0

我會盡快嘗試,並會評論它。但正如我所說,問題在於這兩種類似方法之間的不同行爲。和+1在此線程中友好的帖子和評論。 –