2016-12-05 2 views
1

У меня есть сайт с двумя форматами поиска, вызывающими один и тот же контроллер и действие. Первая форма для автомобилей, вторая для мотоциклов. Каждая форма имеет несколько фильтров поиска. Эти фильтры многозначны.Передача нескольких многозначных параметров контроллеру MVC из другой формы поиска

Мой файл по маршруту:

routes.MapRoute("Cars", 
      "search/cars", 
      new { controller = "Search", action = "Index", SearchType = "Cars", Param1 = "", Param2="" }, null); 
routes.MapRoute("Motorcycles", 
      "search/moto", 
      new { controller = "Search", action = "Index", SearchType = "Moto", Param3 = "", Param4="" }, null); 

Так называя "mywebsite.com/search/cars?Param1=BMW & Param1 = VW" должен получить мне эти значения в мой контроллер:

SearchType = "Cars" 
Param1[] = {"BMW", "VW"} 

Есть ли способ избежать действия в контроллере поиска, объявленного как:

public ActionResult Index(string SearchType, string Param1, string Param2, string Param3, string Param4){} 

вместо этого имеет одну переменную params [], которая затем будет содержать пары ключевых значений? Параметры в обоих случаях имеют разные имена, поэтому я не всегда могу использовать одно и то же имя. Также каждая страница поиска имеет различное количество параметров.

+0

Ваши определения маршрута бессмысленны - они идентичны. Почему бы не разделить методы действий в 'SearchController' - скажем,' public ActionResult Cars (строки [] models) 'и' public ActionResult Motocycles (string [] models) '? И ваши маршруты будут «route.MapRoute» («Автомобили», «поиск/автомобили», новый {controller = «Поиск», action = «Cars»}) '' и 'routes.MapRoute (« Автомобили »,« поиск »/motocycles ", new {controller =" Search ", action =" Motocycles "})' –

+0

И имеют определения маршрута с параметрами Param1 = "", Param2 = "" и т. д. не имеет никакого смысла (как вы можете видеть, они добавляются как параметры строки запроса, потому что вы отправляете форму - ваш браузер не знает ваших определений roue) –

ответ

0

Возможно, вам захочется использовать JSON и выполнить POST с помощью объекта JSON. Если вы используете метод, который будет принимать различные параметры до того момента, когда он может иметь 3-4 + params, вам следует пересмотреть, как переносятся данные. Возможно, создайте модель для поиска, в которой есть фильтры в виде полей? Тогда вы можете просто принять модель как объект и обработать ее таким образом.

Вы также должны рассмотреть возможность использования двух разных действий в контроллере поиска. Даже если вы «ищете», вы заявили, что каждая форма обрабатывает разные данные, а это означает, что вам, вероятно, придется обрабатывать поиск по-разному. Может быть, использовать действие «Автомобили» и действие «Мото»?

+0

Это был вариант ... с использованием POST с объектом JSON. Проблема в том, что в этом случае я меняю URL с помощью history.Push, и я хочу, чтобы пользователь мог перезагрузить текущий (обновленный) URL-адрес и получить тот же результат. Или поделиться своей формой поиска со всеми включенными фильтрами. – MaticDiba

+1

Я вижу, ну а как насчет принятия 'string [] SearchParam' как одного параметра, переданного в URL-адресе? Или вы можете попробовать что-то вроде этого: 'var url = '../search/cars?SearchType=Cars&filters='+ encodeURIComponent (JSON.stringify (data));' где вы все еще можете использовать json-объект через uri –

Смежные вопросы