具有多个路由值的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 = "" } );