MVC URL.RouteUrl删除RouteValues但URL.Action保留它们?

时间:2011-10-17 04:05:09

标签: c# .net asp.net asp.net-mvc vb.net

让我们说我们有这条路线:

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"))%>

3 个答案:

答案 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

请注意:

  • 两种方法之间没有区别
  • 当前路由值仅在URL之前没有更改值时保留。因此'10'被保留,但'de'不是。

我不知道为什么你会看到不同的东西,但我建议你从一个干净的应用程序进行测试,以隔离你应用程序中可能发生的其他事情。

答案 1 :(得分:3)

好的理论上正确的预期mvc行为是,它不应该重用当前请求中的变量,如果它们出现在您指定的段之后的段中。所以我想知道你是否有一些其他路线定义为你所描述的不太正确,所以它可能匹配其他东西。如果不是,它可能是一个错误。

无论因为上述行为(当它工作时!)非常混乱,最佳做法是在创建链接时提供所有段变量,使用如上所述的UrlParameter.Optional。那你就不用担心这种歧义了。

对于它的价值,你看到的第二个结果(即RouteUrl)是正确的行为。行动应该表现得一样。

答案 2 :(得分:1)

看起来这是预期的行动。 http://msdn.microsoft.com/en-us/library/dd492912.aspx表示“为指定的操作名称和路由值生成操作方法的完全限定URL”。意味着它将用路由值填充其他字段吗?

只是猜测...