具有多个路由值的ASP.NET MVC URL路由如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (35)

当我有一个需要多个参数的路由时,我遇到了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 = "" }
);

前两条路线没有问题,但是当我尝试使用以下命令创建到第三条路线的操作链接时:

<%= 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?是的。使用这一个,并查询查询字符串中的任何其他参数。”

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

用户回答回答于

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

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

扫码关注云+社区