通过具有约束的路径将动作输入变量映射到数组

时间:2010-01-29 09:17:12

标签: asp.net-mvc routing constraints url-routing

我正在尝试将一些查询字符串变量映射到一个数组中,该数组是一个操作方法的参数之一。

行动方法如下:

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

//controller logic here

}

我们可以通过使用诸如?generics = test1& generics = test2之类的查询字符串轻松地将MVC绑定到变量泛型,但是我们希望按如下方式设置路由:

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

如果能够做到这一点,请有人这么好,让我们知道,如果可以,怎么做?

谢谢!

专利

1 个答案:

答案 0 :(得分: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