2010-01-29 51 views
1

我想将一些查询字符串变量映射到作为操作方法参数之一的数组中。通过路由将动作输入变量映射到数组,带有约束

的操作方法如下:

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

//controller logic here 

} 

我们可以很容易地得到MVC绑定到变量仿制药使用的查询字符串,例如泛型= test1的&泛型= test2的,但是我们正在设置?一个路线如下:

/不管/ TEST1/test2的

下面的路由配置工作:

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

我们的问题是,我们想对泛型[0]和泛型[1]的值应用一些约束,以便它们的日期格式为12-12-2009。

我们曾尝试以下,但该约束不通过在所有允许任何东西:

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

我们曾尝试以下,但是这投掷了运行时错误:

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

请有人会如此高兴地告诉我们这是否可以完成,如果可以,怎么做?

谢谢!

帕特

回答

2

总有最后一招 - 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)); 
      } 
     } 

然后,只需与约束=>

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

routes.add("UberRoute", route); 

映射你的路线请记住,complex routes can kill you

+0

感谢您的回复Arnis,我会看看这种方法。 – 2010-01-29 15:06:19