生成链接时如何忽略当前路由值?

时间:2011-06-30 05:16:15

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

这个问题类似于asp.net mvc Html.ActionLink() keeping route value I don't want,但有一个扭曲,使其更复杂。

从默认的新MVC3应用程序开始,我将路由更改为:

routes.MapRoute(
    "r1", // Route name
    "{controller}/{id}/{action}"
);

routes.MapRoute(
    "r2", // Route name
    "{controller}/{action}"
);

请注意,id位于第一个操作之前。

然后在Home \ Index.cshtml中,我添加:

@Url.Action("Index")
@Url.Action("Index", new { id = "blah" })
@Url.Action("Index", new { id = "" })

现在我导航到/ Home / Foo / Index并查看3个生成的链接。我得到了

  1. “/主页/富/索引”
  2. “/主页/嗒嗒/索引”
  3. “/家庭/索引?ID =富”
  4. 前两个是有意义的,并且正在使用第一条路线。

    但是在第三个链接中,遇到第二个路径,我不明白为什么id = Foo在查询字符串上传递,因为我明确地传递了一个空id。我希望它只是生成“/ Home / Index”。

    任何人都可以解释一下,并建议我怎样才能让它不显示出来?

4 个答案:

答案 0 :(得分:20)

我刚试过这个,看起来工作正常。

Url.Action("Index", new { id = UrlParameter.Optional })

产生

/Home/Index

答案 1 :(得分:6)

在这种情况下解决它很容易,如果你不在乎它是如何解决的。

将第三个链接更改为:

@Url.RouteUrl("R2")

给了我:

  • / Home / Foo / Index
  • / Home / blah / Index
  • /主页/索引

为什么它在第一种情况下发生的事情是我尚未弄清楚的。我也被这种方式所困扰,但主要是在形式方面。

更新1:

我正在挖掘MVC源代码并创建了一些可以重现此问题的测试。

时似乎是问题所在
RouteCollection.GetVirtualPath(requestContext, correctedValues);

正在运行。它使用旧id创建一个查询字符串。正是为什么我不能说,因为该类不在MVC源中。

答案 2 :(得分:5)

这可能不是您正在寻找的答案,但使用Url.Route而不是Url.Action似乎有效:

@Url.RouteUrl("r2")

这会生成/Home/Index

<强>更新

Phil Haack recommendeds使用路由名称生成网址:

  

这似乎是个大问题,   但修复其实很简单。   使用所有路线的名称和   总是在使用路线名时   生成网址。大部分时间,   让路由排序出哪条路线   你想用来生成一个URL是   真的让它失去了机会。什么时候   你知道,生成一个URL   确切地说您要链接的路线   to,所以你不妨指定它   名。

答案 3 :(得分:1)

因为r2没有将id参数定义为URL的一部分?如果您将其更改为{controller} / {action} / {id},则可以。如果将r2更改为不包含操作,您将看到相同的行为:操作也将变为查询变量。

您明确将其设置为“”的事实意味着无论如何路由都会将其考虑在内。只是不添加id,生成链接时你会没事的。