views:

178

answers:

1

Playing with the new(ish) url rewriting functionality for web forms, but I'm running into trouble trying to declare parameters as optional.

Here's the scenario. I've got a search function which accepts two parameters, sku and name. Ideally I'd like the URL for this search function to be /products/search/skuSearchString/nameSearchString. I also have various management pages that need to map to things like /products/management/ or /products/summary/. In other words, the last two parameters in the URL need to be optional - there might be one search string, or two, or none.

This is how I've declared my virtual URL:

Friend Const _VIRTUALURL As String = "products/{action}/{sku}/{*product}"

And added the following defaults:

    Me.Defaults = New Web.Routing.RouteValueDictionary(New With {.sku = "/"})
    Me.Defaults = New Web.Routing.RouteValueDictionary(New With {.product = "/"})

I have two problems with this setup. The most pressing is that the url seems to expect an sku parameter. So, /products/summary/ cannot be found but /products/summary/anyTextAtAll/ maps to the correct page. You get the same result whether the defaults are set to "/" or "". How do I ensure both sku and product parameters are optional?

The second is more a matter of interest. Ideally, I'd like the url to be able to tell whether or not it's got a product search string or a url search string. The obvious way to do this is to make one or the other default to a value I can just pick up and ignore, but is there a neater way of handling it?

+1  A: 

I'm not sure I entirely understood the question, but I have some comments about what you've shown so far:

The manner in which you're setting defaults seems incorrect. You're first setting a default value dictionary with a value for "sku". You're then replacing the default value dictionary with a value for "product".

A default value of "/" is unlikely to be what you want. In this case it sounds like you want a default value of just "" (empty string).

Try something like:

Me.Defaults = New Web.Routing.RouteValueDictionary(New With {
    .sku = "",
    .product = "" }) 

My VB skills are rather weak, so the syntax I showed might not be exactly right.

I think that if you change both of these then you should be good to go.

Eilon