views:

48

answers:

1

Hi there,

I am trying to map a number of querystring variables into an array that is one of the parameters for an action method.

The action method is as follows:

public ActionResult Index(string url, string[] generics)
{

//controller logic here

}

We can easily get MVC to bind to the variable generics by using a querystring such as ?generics=test1&generics=test2, however we are looking to set up a route as follows:

/whatever/test1/test2

The following route configuration works:

routes.MapRoute(
            "TestRoute",
            "whatever/{generics[0]}/{generics[1]}",
            new { controller = "Main", action = "Index" }}
        );

Our issue is that we would like to apply some constraints to the values generics[0] and generics[1], so that they are in the date format 12-12-2009.

We have tried the following, however the constraint does not allow anything through at all:

routes.MapRoute(
            "TestRoute",
            "whatever/{generics[0]}/{generics[1]}",
            new { controller = "Main", action = "Index" }},
            new { generics = @"[0-9]{2}\-[0-9]{2}\-[0-9]{2,4}" }
        );

We have tried the following, however this threw a run time error:

routes.MapRoute(
    "TestRoute",
    "whatever/{generics[0]}/{generics[1]}",
    new { controller = "Main", action = "Index" }},
    new { generics = new string[2]{ @"[0-9]{2}\-[0-9]{2}\-[0-9]{2,4}",@"[0-9]{2}\-[0-9]{2}\-[0-9]{2,4}"}}
);

Please would someone be so good as to let us know if this can be done, and if so, how?

Thanks!

Pat

+1  A: 

There's always last resort - IRouteConstraint =>

public class GenericsConstraint : IRouteConstraint
        {
            public bool Match(HttpContextBase httpContext, Route route, 
               string parameterName, RouteValueDictionary values, 
               RouteDirection routeDirection)
            {
               //not sure if that will cast
               var generics = values["generics"] as string[]; 

               var rgx = new Regex("tralala");

               // not not... hahahaha
               return !generics.Any(x=>!rgx.Match(x));
            }
         }

Then just map your route with that constraint =>

var route = new Route("whatever/{generics[0]}/{generics[1]}", 
                                    new MvcRouteHandler())
        {Constraints = new RouteValueDictionary(new GenericsConstraint())};

routes.add("UberRoute", route);

Keep in mind that complex routes can kill you.

Arnis L.
Thanks for your response Arnis, I'll take a look at this approach.
Pat C