Url.Action reuses route data when I don't want it to
在我的布局页面中,构成我网站的主要部分的链接通过如下调用呈现:
1 | @SiteSectionLink("index","blog","blog") |
其中
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")用于按日期过滤帖子。除此之外,还有一个可选的
为此,我有以下路线:
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 帮助器以显式地为
1 2 | <a class="site-section" href="@Url.Action(action, controller, new { date = (string)null, postID = (int?)null})">@display |
当前路由值仍在使用,但现在看起来像 "blog?date=11-2010"。
我看到了这个类似的问题,但接受的答案对我不起作用,而且我一开始不使用
虽然您遇到的问题与 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") |