MVC Handler для неизвестного числа необязательных параметров - PullRequest
3 голосов
/ 30 июля 2010

Я работаю на маршруте MVC, который будет принимать неизвестное количество параметров в конце URL. Примерно так:

domain.com / категория / keyword1 / keyword2 /.../ keywordN

Эти ключевые слова являются значениями для фильтров, которые мы должны сопоставить.

Единственный подход, о котором я могу подумать, - это UGLY ... просто создайте ActionResult, который имеет больше параметров, чем мне когда-либо понадобится:

ActionResult CategoryPage (строка urlValue1, строка urlValue2, строка urlValue3 и т. Д.) { }

Это просто не правильно. Я полагаю, что могу втиснуть их в строку запроса, но потом я потеряю свои сексуальные URL-адреса MVC, верно? Есть ли лучший способ объявить метод-обработчик так, чтобы он обрабатывал неизвестное количество необязательных параметров?

Маршруты должны быть подключены при запуске приложения, что не должно быть так сложно. Максимальное количество ключевых слов может быть легко определено из базы данных, так что нет ничего важного.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 30 июля 2010

Вы можете использовать параметр «поймать все», как этот:

routes.MapRoute("Category", "category/{*keywords}", new { controller = "Category", action = "Search", keywords = "" });

Тогда у вас будет один параметр в вашем методе действия поиска:

public ActionResult Search(string keywords)
{
    // Now you have to split the keywords parameter with '/' as delimiter.
}

Вот список возможных URL-адресов со значением параметра ключевых слов:

http://www.example.com/category (ключевые слова: "")
http://www.example.com/category/foo (ключевые слова: "foo")
http://www.example.com/category/foo/bar (ключевые слова: "foo / bar")
http://www.example.com/category/foo/bar/zap (ключевые слова: "foo / bar / zap")

1 голос
/ 30 июля 2010

Вы можете сделать ключевые слова частями одного и того же параметра маршрута и объединить их тире (-). Ваш поисковый маршрут будет выглядеть так

routes.MapRoute("Category", "category/{searchstring}", new { controller = "Category", action = "Search", searchstring = "" }, null));

, и вы создадите свои URL так:

www.domain.com/category/cars-furniture-houses-apparel

Вы бы разбили его в своем действии контроллера.

Старайтесь избегать огромного количества параметров любой ценой.

...