Использование двух строго типизированных моделей для одного представления MVC
-
22-08-2019 - |
Вопрос
Я упускаю что-то фундаментальное для принципов MVC или я схожу с ума?
Если у меня есть представление, которое отображает список книг и список авторов, я должен создать класс, который имел бы список книг и список авторов в качестве свойств.Верно?
Затем я бы строго ввел представление, чтобы использовать этот класс.
Теперь я хочу создать новую страницу с теми же объявлениями, но на которой также есть список рекламных акций.Нужно ли мне создать другой класс со свойством list of Books, свойством list of authors и свойством list of promotions?
Если я создаю классы для всех представлений, я создаю чертовски много дополнительной работы.Должен ли я создавать строго типизированные части для каждой из них?Что делать, если макет каждый раз отличается?
В настоящее время у меня есть класс BaseViewData, который используется всеми представлениями, поскольку он содержит некоторые общие свойства.Однако сейчас я изо всех сил пытаюсь вставить другие элементы без полного раздувания класса BaseViewData.
Пожалуйста, кто-нибудь может помочь мне понять теорию, которую не охватывают все простые примеры.
Решение
Я использую Методы расширения ViewData От MvcКонтриб это добавляет поддержку для нескольких строго типизированных моделей (при условии, что они разных типов).Код для добавления их в ViewData выглядит следующим образом:
User currentUser = GetCurrentUser();
List<Project> projectList = projectRepository.GetRecentProjects(currentUser);
ViewData.Add(user);
ViewData.Add(projectList);
Код в представлении для их извлечения выглядит следующим образом:
User user = ViewData.Get<User>();
List<Project> projectList = ViewData.Get<List<Project>>();
Это удаляет как "волшебные строки", так и приведение типов.Обратите внимание, это ничего не делает со свойством Model представления.
Другие советы
Создайте ОДИН класс контейнера для каждого объекта в вашей системе и используйте для всех представлений - просто
Объекты с нулевым значением не имеют реальных накладных расходов
Я столкнулся с той же проблемой.Я думаю, что общее решение для большинства людей - создать класс-контейнер, содержащий модели книг и авторов, которые вам действительно нужны, и передать этот контейнер вашему представлению.
Неоптимально, да, но это работает.Надеюсь, это будет рассмотрено в будущих версиях фреймворка.