#asp.net-mvc-3 #controller #viewmodel #viewcontroller
#asp.net-mvc-3 #контроллер #viewmodel #viewcontroller ( контроллер просмотра ) #viewcontroller
Вопрос:
У меня есть веб-приложение MVC3, в котором мне нужно реализовать функцию поиска в базе данных. Я создаю класс ViewModel для своей формы поиска, чтобы я получал параметры поиска из представления в контроллер. Я могу успешно получить все мои параметры поиска (которые включают поисковый запрос и флажки, если пользователь хочет сузить поиск) в моем классе контроллера и извлечь данные из базы данных, используя шаблон репозитория
var searchResult = _repository.GetItems(searchParms, chkbox1, chkbox2, ..., chkbox10)
После этого я передаю свой результат поиска помощнику по разбивке на страницы, например
var paginatedSearchResult = new PaginatedList<Items>(searchResult, page ?? 0, pageSize);
Я отображаю извлеченные данные на своей странице просмотра
return View(paginatedSearchResult)
Проблема, с которой я сталкиваюсь, заключается в том, что помимо данных из базы данных, мне также нужно показать строку поискового запроса и тему (для которой использовался флажок) на моей странице просмотра, чтобы пользователь мог видеть, что он искал. Я не нашел никакого правильного решения для этого и должен был использовать ViewBag. И теперь моя страница контроллера выглядит уродливо с более чем 10 ViewBag. Я знаю, что должно быть какое-то хорошее решение для этого, но я не могу его найти.Любые предложения будут высоко оценены.
Спасибо, ACS
Ответ №1:
Прямой ответ на заголовок вопроса — альтернативой viewbag в mvc являются строго типизированные классы ViewModel. Взгляните на создание моделей представления
Ответ №2:
Вы уже тааак близко. У вас есть ViewModel, которую вы используете для поиска, поэтому вы, очевидно, знаете, как создать модель представления. Просто создайте новую ViewModel, которая имеет вашу текущую ViewModel в качестве свойства и viewmodel поиска в базе данных в качестве свойства.
общедоступный класс SearchViewModel { общедоступный YourExistingSearchOptionsViewModel SearchViewModel {получить; установить} результаты поиска в общедоступном списке страниц {получить; установить;} }
очевидно, что это очень грубо, но, надеюсь, вы поняли идею.
Комментарии:
1. Спасибо @Adam. Я попытался создать новую NewViewModel со свойством 3 внутри. Первый является
MyOriginalViewModel (that I used to retrieve search query)
, второй —PaginatedList (to retrieve paging)
и третийDBItems (that contains all the records)
. Итак, вместо того, чтобы выполнять returnView(paginatedSearchResult)
, я делаю returnView(NewViewModel)
и следующее на моей странице просмотра.@model IEnumerable<App.ViewModel.NewViewModel>
.Но я получил ошибку компиляции «Элемент модели, переданный в словарь, имеет тип ‘NewViewModel’, но требует элемента модели типа ‘Sys.Coll. Общий. IEnumerable`».2. Вы возвращаете отдельный объект, а не список, поскольку список находится внутри viewmodel. Удалите ienumerable<> и просто используйте @model App.ViewModel. NewViewModel
3. Что ж, если я удалю страницу просмотра формы IEnumerable, я не смогу перебирать свой набор записей. Когда я это сделал, я получил предупреждение «оператор foreach не может работать с переменными типа ‘App.ViewModel. Новая ViewModel’потому что’App.ViewModel. NewViewModel’ не содержит общедоступного определения для ‘GetEnumerator'». У меня есть много записей, которые я хочу просмотреть и отобразить на странице просмотра, помимо статического пользовательского ввода. Спасибо!
4. Теперь у меня все заработало. Я использовал @model MyApp.ViewModel. NewViewModel на странице просмотра и объявил свойство ‘public PaginatedList<Элементы> paginatedSearchList { получить; установить; }` в NewViewModel. Спасибо за вашу помощь.
5. именно для этого я добавил код в модели выше : ) public PaginatedList SearchResults {получить;установить;}
Ответ №3:
Я думаю, вы, возможно, ищете строго типизированное свойство «ViewData»