Альтернатива для ViewBag в MVC3

#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) . Итак, вместо того, чтобы выполнять return View(paginatedSearchResult) , я делаю return View(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»