作为 ASP.MVC 的新手,我正在寻找以下路由问题的解决方案。
我希望这些 URL 能够引导至显示的页面:
/Member/123/A+Strange+Username -> 包含成员(member)详细信息的页面
/Member/123 -> 如上所述
/Member/Connections/123 -> 包含成员连接列表的页面
/Member/Connections/123/A+Strange+Username -> 如上所述
/Member/Comments/123 -> 包含成员评论列表的页面
/Member/Comments/123/A+Strange+Username -> 如上所述
用户名应被忽略,但会附加到链接中以帮助搜索引擎。
我尝试过以下路线:
routes.MapRoute("MemberPage", "Member/{id}/{*name}", new { controller = "Member", action = "Details", id = "" });
routes.MapRoute("MemberAction", "Member/{action}/{id}/{*name}", new { controller = "Member", action = "Details", id = "" });
但它似乎总是默认为第一条路线,然后会收到错误,因为“连接”或“评论”对于详细信息 Controller 来说是无效的 ID。
有没有办法根据 id 值的类型切换路由,或者有其他方法来解决这个问题?
最佳答案
如果您向 {id} 两条路由添加路由约束,可能会有所帮助。
routes.MapRoute("MemberPage", "Member/{id}/{*name}",
new { controller = "Member", action = "Details", id = "" },
new { id=@"\d+" });
routes.MapRoute("MemberAction", "Member/{action}/{id}/{*name}",
new { controller = "Member", action = "Details", id = "" },
new { id=@"\d+" });
这样,它就不会尝试将第一个路由中的“评论”映射到 {id},而是会转到第二个路由,该路由应该可以与该 URL 正常工作。
关于asp.net-mvc - 根据 url 中的可选操作值进行路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1087175/