让我们说我们有这条路线:
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 ,但会保留 lang 。
但是这段代码:
<%= Url.RouteUrl("Library", New With {.id = 45})%>
返回:
http://localhost/Lib/45
它会更改 ID ,但会移除 lang !
这是一个错误还是什么?我知道如何解决这个问题,但这种不同的行为非常令人困惑。我对吗?或者只是想象一下?
一个快速解决方案是:
<%= Url.RouteUrl("Library", New With {.id = 45},.lang = RouteData.Values("lang"))%>
答案 0 :(得分: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
请注意:
我不知道为什么你会看到不同的东西,但我建议你从一个干净的应用程序进行测试,以隔离你应用程序中可能发生的其他事情。
答案 1 :(得分:3)
好的理论上正确的预期mvc行为是,它不应该重用当前请求中的变量,如果它们出现在您指定的段之后的段中。所以我想知道你是否有一些其他路线定义为你所描述的不太正确,所以它可能匹配其他东西。如果不是,它可能是一个错误。
无论因为上述行为(当它工作时!)非常混乱,最佳做法是在创建链接时提供所有段变量,使用如上所述的UrlParameter.Optional。那你就不用担心这种歧义了。
对于它的价值,你看到的第二个结果(即RouteUrl)是正确的行为。行动应该表现得一样。
答案 2 :(得分:1)
看起来这是预期的行动。 http://msdn.microsoft.com/en-us/library/dd492912.aspx表示“为指定的操作名称和路由值生成操作方法的完全限定URL”。意味着它将用路由值填充其他字段吗?
只是猜测...