Использование базового контроллера для получения 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 в родительском классе, выполняющем то, что должен делать каждый производный контроллер.