具有多个路由值的ASP.NET MVC URL路由

我有Html.ActionLink有麻烦,当我有一个路线,需要多个参数。 例如,给定在我的Global.asax文件中定义的以下路由:

routes.MapRoute( "Default", // Route name "{controller}.mvc/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); routes.MapRoute( "Tagging", "{controller}.mvc/{action}/{tags}", new { controller = "Products", action = "Index", tags = "" } ); routes.MapRoute( "SlugsAfterId", "{controller}.mvc/{action}/{id}/{slug}", new { controller = "Products", action = "Browse", id = "", slug = "" } ); 

前两条路线工作没有问题,但是当我尝试创build一个动作链接到第三条路线使用:

 <%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %> 

我最终得到一个类似于[site-root] / Details / 1?slug = url-slug的URL,而我希望URL更像[site-root] / Details / 1 / url-slug

任何人都可以看到我要去哪里错了吗?

它正在使用完全满意的第一条路线。 尝试将您的SlugsAfterId路线放在Default路线上方。

它基本上是:“检查默认。有一个行动?是的。有一个ID?是的。使用这一个,并查询查询string中的任何其他参数。

作为一个侧面说明,这样做会使您的Default路由冗余,因为您提供了slug参数的默认值。

加里(上图)是正确的。 您可以使用Haack先生的路由debugging器来进行MVC。 它可以通过显示哪些路由被命中以及何时解决路由问题。

这里是博客文章 。 这里是Zip文件 。

您可以添加约束到您的路由包含“ID”,因为它大概只接受一个数字。 这样,第一条路线只有在“id”是数字时才匹配,那么它将为所有其他值创build第二条路线。 然后将包含{slug}的那个放在最上面,一切都应该正常工作。

 routes.MapRoute( "SlugsAfterId", "{controller}.mvc/{action}/{id}/{slug}", new { controller = "Products", action = "Browse", id = "", slug = "" }, new { id = @"\d+" } ); routes.MapRoute( "Default", // Route name "{controller}.mvc/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" }, // Parameter defaults new { id = @"\d+" } ); routes.MapRoute( "Tagging", "{controller}.mvc/{action}/{tags}", new { controller = "Products", action = "Index", tags = "" } );