2009-05-05 3 views
1

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

Моя форма поиска использует 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 

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

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

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

Спасибо!

ответ

2

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

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

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

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

А, это хорошо и аккуратно, спасибо! – CapBBeard

2

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

1

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

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

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

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

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

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