ASP.NET MVC Paging - Передача сложных типов обратно в контроллер? - PullRequest
1 голос
/ 06 мая 2009

В настоящее время я работаю над довольно простым приложением 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 (поскольку это страница результатов поиска).

Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 мая 2009

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

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

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

return Html.ActionLink("First", "Results", searchCriteria)
2 голосов
/ 06 мая 2009

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

1 голос
/ 26 мая 2009

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

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

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

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

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

...