Отображение входных переменных действия в массив через маршрут с ограничениями - PullRequest
1 голос
/ 29 января 2010

Я пытаюсь отобразить несколько переменных строки запроса в массив, который является одним из параметров для метода действия.

Метод действия следующий:

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

//controller logic here

}

Мы можем легко заставить MVC связываться с универсальными переменными, используя строку запроса, такую ​​как? Generics = test1 & generics = test2, однако мы собираемся настроить маршрут следующим образом:

/ все / test1 / test2

Работает следующая конфигурация маршрута:

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

Наша проблема в том, что мы хотели бы применить некоторые ограничения к значениям generics [0] и generics [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}"}}
);

Пожалуйста, кто-нибудь будет так хорош, чтобы сообщить нам, если это можно сделать, и если да, то как?

Спасибо!

Pat

1 Ответ

2 голосов
/ 29 января 2010

Всегда есть последнее средство - 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);

Имейте в виду, что сложные маршруты могут убить вас .

...