Использование базового контроллера для получения Common ViewData
Я работаю над приложением ASP.NET MVC, которое содержит заголовок и меню на каждой странице. Меню и заголовок являются динамическими. Другими словами, элементы меню и информация заголовка определяются во время выполнения.
Моя первоначальная мысль - построить базовый контроллер, из которого производятся все остальные контроллеры. В базовом контроллере я получаю данные меню и заголовка и вставляю необходимую информацию в ViewData. Наконец, я буду использовать ViewUserControl для отображения заголовка и меню с помощью шаблона главной страницы.
Итак, я пытаюсь определить наилучшую практику для создания таких функций. Кроме того, если это рекомендуемый подход, какой метод следует переопределить (я угадываю "Выполнить" ) при получении данных для вставки в ViewData.
Я уверен, что это распространенный сценарий, поэтому любые советы/лучшие практики будут оценены! Спасибо заранее!
EDIT:
Я нашел следующие ресурсы после публикации (конечно), но любые дополнительные анекдоты были бы замечательными!
http://www.singingeels.com/Blogs/Nullable/2008/08/14/How_to_Handle_Side_Content_in_ASPNET_MVC.aspx
Как вы используете usercontrols в asp.net mvc, которые отображают "остров" , данных?
Ответы
Ответ 1
В зависимости от того, откуда поступает ваша информация. У нас есть стандартные данные представления, которые мы используем для создания некоторой информации, которую мы имеем на экране, которую мы создаем именно таким образом. Он хорошо работает и легко поддерживается. Мы переопределяем метод View для реализации строго типизированных имен имен и используем эту информацию для извлечения некоторых данных, которые также требуется для главной страницы.
Ответ 2
Вы можете написать вспомогательное расширение для отображения заголовка/меню
Таким образом, вы могли бы показать это в разных местах в представлении, если вам нужно, но только в одном месте для обслуживания.
public static HtmlString MainMenu(this HtmlHelper helper)
Ответ 3
Используйте класс базового контроллера для реализации методов фильтра генераторов. Класс контроллера реализует некоторые интерфейсы фильтров IActionFilter, IAuthorizationFilter, IExceptionFilter и IResultFilter, которые полезны для реализации некоторого общего поведения для всех контроллеров.
Если данные меню одинаковы на всех страницах, но разные для каждого уникального пользователя.
Создайте менудаты в методе OnAuthorization
или Initialize
базового класса вашего контроллера. Сначала будет вызываться авторизация. Initialize
будет вызываться перед каждым действием. У вас есть доступ к Контексту ViewData. Создайте менудату.
Поместите содержимое представления для меню и заголовка на главную страницу и получите доступ к созданным ViewData там.
Ответ 4
Я пару месяцев назад занимался аналогичной проблемой дизайна - реализовав функцию палитры, которая изменяется, когда пользователь переходит со страницы на страницу.
Я переопределил метод OnActionExecuting
, чтобы собрать панировочные сухари и сохранить их в ViewData
(я использую имя действия как breadCrumb представления). Затем я обновил главную страницу, чтобы включить пользовательский элемент управления, который принимает ViewData
и отображает панировочные сундуки.
Следует помнить, что если вы использовали атрибут обработки ошибок ASP.NET MVC по умолчанию [HandleError]
, а на вашей странице ошибок используется одна и та же главная страница, которая пытается прочитать ViewData
, вы скоро узнаете что вы не можете получить доступ к ViewData
со своей страницы ошибок, и это приведет к возникновению исключения. В зависимости от того, нужен ли вам сценарий ViewData
для сбоя, жизнеспособным решением является использование отдельной главной страницы или сделать это: Как передать ViewData в представление HandleError?
Ответ 5
Я отвечу на ваш вопрос другим вопросом. Будет ли базовый контроллер определять, какой тип он действительно предназначен для создания правильных данных меню? Если это так, то вы побеждаете цель полиморфизма, а код для генерации данных должен идти в каждом контроллере, возможно, в OnActionExecuting, если меню одинаково для всех действий. Выталкивание его обратно в родительский класс, похоже, в конечном итоге приведет к некоторому оператору switch в родительском классе, выполняющем то, что должен делать каждый производный контроллер.