I’m trying to create routes which follow the structure of a tree navigation system, i.e I want to include the entire path in the tree in my route. So if I had a tree which looked like this
- Computers
- Software
- Development
- Graphics
- Hardware
- CPU
- Graphics cards
- Software
Then I would like to be able to have routes that looks like this
- site.com/catalog/computers/software/graphics
This, on it’s own is not hard and can be caught by a route which looks like this
- catalog/{*categories}
However I want to be able to add the product information at the end of that URL, something like this
- site.com/catalog/computers/software/graphics/title=Photoshop
Which would mean I would requite routes that were defined like the following examples
- site.com/{*categories}/title={name}
- site.com/{*categories}
However the first of these routes are invalid since nothing else can appear after a greedy parameter such as {*categories} so I’m a bit stuck. I’ve been thinking of implementing regex routes or perhaps use IRouteContraint to work my way around this but I can’t think of a decent solution that would enable me to also use the Html.ActionLink(…) method to generate outbount URLs which filled in both {*categories} and {name}
Any advice is greatly apprechiated!
Some of you may have seen a similar question by me yesterday but that was deleted, by me, since I’ve since given it more thought and the old question contained incomplete descriptions of my problem
UPDATE 2008/11/26 I posted the solution at http://thecodejunkie.blogspot.com/2008/11/supporting-complex-route-patterns-with.html
Routes ignore query string parameters. But at the same time, query string parameters are passed in to an action method as long as there isn’t a route URL parameter of the same name. So I would use just the second route, and pass in title via the query string.
Another option is more complicated. You write a custom route that derives from Route and override the GetRouteData method so that it parses the value of ‘categories’ (something like RouteData.Values[‘categories’] and then add the parsed data to the route value dictionary (RouteData.Values[‘title’] = parsedTitle.