2011-07-05 53 views
0

为什么会在404这条路线的结果未找到击球的URL /users/3当只后在ASP.NET MVC与页码的路线拨打:routes.MapRoute()404将导致找不到

routes.MapRoute(
    "Users", // Route name 
    "users/{page}/{sortColumn}/{sortDirection}", // URL with parameters 
    new { controller = "User", action = "Index", page = UrlParameter.Optional, sortColumn = UrlParameter.Optional, sortDirection = UrlParameter.Optional }, // Parameter defaults 
    new { page = @"\d+", sortColumn = @"[\w-]+", sortDirection = @"asc|desc" } // Route constraints 
); 

不该对于我来说只需要指定page参数就可以加载路由,因为sortColumnsortDirection参数都设置为UrlParameter.Optional

更新:

好挖一个类似的话题另一StackOverflow的答案后,看来如果你选择有一个可选路线,约束也必须是可选的。因此,将我的路线约束更改为:
new { page = @"\d*", sortColumn = @"[\w-]*", sortDirection = @"(asc|desc)?" }
只需测试零个或多个匹配项即可使我的页面加载到所有帐户。

但是,如果我尝试制作反映该路线的链接(@Html.RouteLink("test 2", "Users", new { page = 2 })),则超链接会生成为/users而不是/users/2!奇怪的是,如果我手动打/users/2那么RouteLink被写为/users/2哈哈! :)

也许我必须做出单独的路线,但这实在是不可取的,因为我不想在Html.RouteLink()之间拨打不同的命名路线...... 想法?

+1

如果删除路由约束,你仍然有404的问题?只是想知道在可选参数上指定约束是否存在问题。 –

+0

是的,它可以是路由约束,也可以是URL匹配另一条路由,但无法找到路由的操作。 – RPM1984

回答

1

因为你提供两个参数,但预计3周可选的人..所以它不知道缺少哪一个......

一般来说,你不能使用两个连续的可选参数。

参考

+0

这很奇怪,我想我会设置一个非常简单的路线。谢谢你的帮助;那么你会建议我把它分成几条路线?我真的很想避免这种情况,所以'Html.RouteLink()'可以是一致的,不需要调用不同的命名路由。 – GONeale

+0

我只是看着那个bug,看来Phil Haack也发布了这个消息。 http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx毕竟,解决方案可能是两条路线。 – GONeale

+0

将奖励答案,因为我们现在拥有最好的:) – GONeale