2010-01-29 5 views
1

J'essaie de mapper un certain nombre de variables de chaîne de requête dans un tableau qui est l'un des paramètres d'une méthode d'action.Mappage de variables d'entrée d'action à un tableau via une route, avec des contraintes

La méthode d'action est la suivante:

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

//controller logic here 

} 

On peut facilement obtenir MVC de se lier aux génériques variables en utilisant un querystring comme les génériques = test1 & génériques = test2, mais nous cherchons à établir? une route comme suit:

/whatever/test1/test2

La configuration de l'itinéraire suivant fonctionne:

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

Notre problème est que nous aimerions appliquer certaines contraintes aux valeurs génériques [0] et génériques [1], afin qu'elles soient au format de date 12-12-2009.

Nous avons essayé ce qui suit, mais la contrainte ne permet rien passer du tout:

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}" } 
     ); 

Nous avons essayé ce qui suit, mais cela a jeté une erreur de temps d'exécution:

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}"}} 
); 

S'il vous plaît quelqu'un serait-il assez bon pour nous faire savoir si cela peut être fait, et si oui, comment?

Merci!

Pat

Répondre

2

Il y a toujours dernier recours - 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)); 
      } 
     } 

Puis qu'élaborer votre itinéraire avec cette contrainte =>

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

routes.add("UberRoute", route); 

Gardez à l'esprit que complex routes can kill you.

+0

Merci pour votre réponse Arnis, je vais jeter un oeil à cette approche. –

Questions connexes