ASP.NET Подкачка MVC - Передача сложных типов обратно в контроллер?

StackOverflow https://stackoverflow.com/questions/827408

  •  05-07-2019
  •  | 
  •  

Вопрос

В настоящее время я работаю над достаточно простым приложением MVC, которое позволяет пользователю вводить некоторые данные поиска, получать список результатов, затем просматривать каждый элемент и т.д.Все идет довольно хорошо, однако сейчас я пытаюсь реализовать подкачку, но у меня возникают некоторые проблемы.

Моя форма поиска использует HTTP GET, запрашивая следующее действие:

public ActionResult Results(PropertySearchData data, int? page)
{
    ...
    IEnumerable<Property> search = mService.SearchProperties(data);

    ViewData["SearchData"] = data;
    return View("Results", "Site", search.ToPagedList(page ?? 0, 20));
    ...
}

Отсюда я строю свою таблицу результатов из коллекции IEnumerable, переданной в мое представление.Кроме того, я использовал ViewData для хранения параметров поиска, чтобы я мог передавать их, когда пользователь запрашивает другую страницу.

Например, чтобы перейти на первую страницу, я хотел бы использовать что-то вроде этого:

Html.ActionLink("First", "Results", new { data = ViewData["SearchData"], page = 1 })

Однако, когда эта ссылка генерируется, моя ссылка выглядит следующим образом

/Results?data=PropertySearchData&page=1

Если я полностью удалю параметр 'page' и просто передам ViewData["SearchData"] в качестве значения моего маршрута, моя ссылка будет сгенерирована так, как я хотел бы (т. Е. каждый элемент PropertySearchData передается в виде строки запроса через функцию привязки модели.Я предполагаю, что это связано с тем, что привязка модели может корректно работать только тогда, когда вы указали один тип?

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

Обратите внимание, что я действительно хочу придерживаться HTTP GET (учитывая, что это страница результатов поиска).

Спасибо!

Это было полезно?

Решение

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

Чтобы получить номер страницы, вы могли бы использовать словарь значений маршрута (что, вероятно, в любом случае делается под капотом) и использовать переопределение, которое принимает IDictionary:-

//In some HtmlHelper extension method or something 
var searchCriteria = new RouteValueDictionary(ViewData["searchData"]);
searchCriteria.Add("page", 1);

return Html.ActionLink("First", "Results", searchCriteria)

Другие советы

С тех пор как data или ViewData["SearchData"] находится в экземпляре PropertySearchData Я предполагаю, что Html.ActionLink зовет ToString() на это и не дает того результата, которого вы ожидали бы.

Создание метода расширения HtmlHelper было бы не лучшим способом решить эту проблему.Это не добавит общей функциональности, только увеличит (визуальный) беспорядок...

routeValues перегружает Html.ActionLink ожидает объект или RouteValueCollection (идентификатор).Теперь вы используете перегрузку объекта (поскольку новый конструктор {} является анонимным объектом).

Вы могли бы использовать следующее для создания правильного параметра routeValues:

new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } }

Это инициализирует новую RouteValueCollection с текущими данными поиска, а затем добавляет ключ "страница" с новым значением (перезаписывает, если оно существует в данных поиска).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top