在路由定义的中间使用贪婪路由参数

时间:2008-11-19 07:22:00

标签: asp.net-mvc routing

我正在尝试创建遵循树导航系统结构的路线,即我想在路线中包含树中的整个路径。所以,如果我有一棵看起来像这样的树

  • 计算机
    • 软件
      • 开发
      • 图形
    • 硬件
      • CPU
      • 显卡

然后我希望能够拥有这样的路线

  • site.com/catalog/computers/software/graphics

这个,它本身并不难,可以通过看起来像这样的路线来抓住

  • 目录/ {*}类别

但是,我希望能够在该URL的末尾添加产品信息,如下所示

  • site.com/catalog/computers/software/graphics/title=Photoshop

这意味着我会要求像以下示例所定义的路线

  • site.com / {*类别} /标题= {名称}
  • site.com / {*}类别

然而,这些路线中的第一条是无效的,因为在诸如{* categories}之类的贪婪参数之后没有其他任何东西可以出现,所以我有点卡住了。我一直在考虑实现正则表达式路由或者可能使用IRouteContraint来解决这个问题,但是我想不出一个能让我使用 Html.ActionLink(...)生成包含{* categories}和{name}

的outbount URL的方法

任何建议都非常重要!

你们中的一些人昨天可能已经看到了类似的问题,但是我已经删除了这个问题,因为我已经更多地考虑了这个问题,而旧的问题包含对我的问题的不完整描述 < / p>

更新2008/11/26 我在http://thecodejunkie.blogspot.com/2008/11/supporting-complex-route-patterns-with.html发布了解决方案

2 个答案:

答案 0 :(得分:4)

网址中任意位置的贪婪段

我写过GreedyRoute类,它支持URL中任何位置的贪婪(catch all)段。你需要它已经有一段时间了,但是将来可能对其他人有用。

它支持以下任何模式:

  • {segment}/{segment}/{*greedy} - 默认Route
  • 已支持此功能
  • {segment}/{*greedy}/{segment} - 中间贪婪
  • {*greedy}/{segment}/{segment} - 贪婪

您可以阅读所有详细信息on my blog post并获取代码。

答案 1 :(得分:3)

路由忽略查询字符串参数。但同时,只要没有相同名称的路由URL参数,查询字符串参数就会传递给操作方法。所以我只使用第二条路线,并通过查询字符串传递标题。

另一个选择更复杂。您编写一个派生自Route的自定义路由并覆盖GetRouteData方法,以便它解析“categories”的值(类似于RouteData.Values [“categories”],然后将解析后的数据添加到路由值字典(RouteData.Values) [“title”] = parsedTitle。