关于 asp.net:Url.Action 在我不想要的时候重用路由数据

Url.Action reuses route data when I don't want it to

在我的布局页面中,构成我网站的主要部分的链接通过如下调用呈现:

1
@SiteSectionLink("index","blog","blog")

其中 SiteSectionLink 是一个看起来像这样的助手:

1
2
3
4
5
6
7
8
9
10
11
@helper SiteSectionLink(string action, string controller, string display)
  {
 
<li>

   
      @display
 
</li>

}

在实际的博客页面上,所有链接还引用了"索引"操作,但还指定了一个日期参数(例如"blog/4-2011"或"blog/2010")用于按日期过滤帖子。除此之外,还有一个可选的 postID 参数,用于引用特定的帖子。

为此,我有以下路线:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
routes.MapRoute(
"Blog",
"blog/{date}/{postID}",
  new
  {
    controller ="blog",
    action ="index",
    date = UrlParameter.Optional,
    postID = UrlParameter.Optional
  }
);

routes.MapRoute(
 "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
    new { controller ="Home", action ="Index", id = UrlParameter.Optional } // Parameter defaults
);

现在,问题是当我单击类似于"blog/11-2010"或"blog/11-2010/253"的链接时,我的布局页面中的链接指向当我希望我的博客仅链接到 "blog/" 而不是 "blog/11-2010" 时,我的博客现在通常也引用相同的 URL。

如果我更改 SiteSectionLink 帮助器以显式地为 datepostID 传入 null,如下所示:

1
2
<a class="site-section" href="@Url.Action(action, controller,
  new { date = (string)null, postID = (int?)null})">@display

当前路由值仍在使用,但现在看起来像 "blog?date=11-2010"。

我看到了这个类似的问题,但接受的答案对我不起作用,而且我一开始不使用 ActionLink 并且我怀疑 ActionLink 会在引擎盖下使用 Url.Action


虽然您遇到的问题与 Phil Haack 在这篇博文中详述的关于 MVC3 路由和具有两个可选参数的路由的错误的行为不太一样,但我建议应用 Phil\\ 帖子中描述的修复程序。

我还建议永远不要使用两个可选参数创建路由,而是遵循将所需路由分成两个单独路由的模式。


是 Url.Action 方法将参数放在查询字符串中。
您可以像这样更改您的助手:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@helper SiteSectionLink(string action, string controller, string display, string date = null, string id=null)
{
 
<li>
 
    @if (date == null)
    {
        @display // simple workaround or better use P. Haack workaround
    }
    else
    {
        @display
    }
 
</li>
 
}

所以你可以像这样使用 SiteSelectionLink:

1
2
3
@SiteSectionLink("Index","Blog","test","2011","4")
@SiteSectionLink("Index","Blog","test2","2011")
@SiteSectionLink("Index","Blog","test3")