views:

430

answers:

1

Hi,

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

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

+2  A: 

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.

Haacked
If I used a querystring parameter then would Html.ActionLink be able to render the parameter back out again, same for a custom route? A custom Route is fine, I just have to figure out where to begin.PS. Check your blog mail, you've got an interview request mail waiting a couple of days :-)
TheCodeJunkie
It took some research (reflector for the win!) but I managed to implement my custom route to handle this and not only that, but it gave me a new understanging on how routing works.I'll update this post with a link to my blog once I've written up on how I solved it! Thanks Phil for the hints!
TheCodeJunkie