2008-12-03 2 views
10

Я работаю над приложением ASP.NET MVC, которое содержит заголовок и меню на каждой странице. Меню и заголовок являются динамическими. Другими словами, элементы меню и информация заголовка определяются во время выполнения.Использование базового контроллера для получения Common ViewData

Моя первоначальная мысль - построить базовый контроллер, из которого производятся все остальные контроллеры. В базовом контроллере я получаю данные меню и заголовка и вставляю необходимую информацию в ViewData. Наконец, я буду использовать ViewUserControl для отображения заголовка и меню через шаблон главной страницы.

Итак, я пытаюсь определить наилучшую практику для создания такой функциональности. Кроме того, если это рекомендуемый подход, какой метод я должен переопределить (я предполагаю выполнение) при получении данных для вставки в ViewData.

Я уверен, что это распространенный сценарий, поэтому любые советы/лучшие практики будут оценены! Заранее спасибо!

EDIT: Я нашел следующие ресурсы после публикации этого (конечно), но любые дополнительные анекдоты были бы замечательными!

http://www.singingeels.com/Blogs/Nullable/2008/08/14/How_to_Handle_Side_Content_in_ASPNET_MVC.aspx

How do you use usercontrols in asp.net mvc that display an "island" of data?

ответ

2

В зависимости от места вашей информации. У нас есть стандартные данные представления, которые мы используем для создания некоторой информации, которую мы имеем на экране, которую мы создаем именно таким образом. Он хорошо работает и легко поддерживается. We override the View method to implement strongly typed view names и используйте эту информацию для извлечения некоторых данных, требуемых главной страницей.

+0

Это довольно удивительная техника. +1 Bazillion – jfar 2010-08-17 01:37:46

0

Я отвечу на ваш вопрос другим вопросом. Будет ли базовый контроллер определять, какой тип он действительно предназначен для создания правильных данных меню? Если это так, то вы побеждаете цель полиморфизма, а код для генерации данных должен идти в каждом контроллере, возможно, в OnActionExecuting, если меню одинаково для всех действий. Выталкивание его обратно в родительский класс, похоже, в конечном итоге приводит к тому, что в родительском классе выполняется оператор switch, выполняющий то, что должен был бы выполнять каждый производный контроллер.

+0

Данные меню одинаковы на всех страницах, но отличаются для каждого уникального пользователя. – 2008-12-03 19:23:44

1

Вы можете написать вспомогательное расширение для визуализации заголовка/меню Таким образом, вы могли бы показать его в разных местах в представлении, если вам нужно, но только одно место для обслуживания.

public static HtmlString MainMenu(this HtmlHelper helper) 
1

Используйте класс базового контроллера для реализации методов фильтра генераторов. Класс контроллера реализует некоторые интерфейсы фильтров IActionFilter, IAuthorizationFilter, IExceptionFilter и IResultFilter, которые полезны для реализации некоторого общего поведения для всех контроллеров.

Если данные меню одинаковы на всех страницах, но разные для каждого уникального пользователя.
Создайте menudata в методе OnAuthorization или Initialize вашего базового класса контроллера. Сначала будет вызываться авторизация. Initialize будет вызываться перед каждым действием. У вас есть доступ к Контексту ViewData. Создайте менудату. Поместите содержимое представления для меню и заголовка на главную страницу и получите доступ к созданному ViewData.

1

Я пару лет назад занимался аналогичной проблемой проектирования - реализовав функцию палитры, которая изменяется, когда пользователь переходит со страницы на страницу.

Я переопределил метод OnActionExecuting, чтобы собрать панировочные сухари и хранить их в ViewData (Я использую название действия как breadCrumb вида). Затем я обновил главную страницу, чтобы включить пользовательский элемент управления, который принимает ViewData и отображает панировочные сухари.

Следует иметь в виду, что если вы использовали атрибут обработки ошибок ASP.NET MVC по умолчанию [HandleError], а на странице с ошибкой используется одна и та же основная страница, которая пытается прочитать ViewData, вы скоро узнаете, что можете 't получите ViewData со своей страницы с ошибкой, и это вызовет исключение. В зависимости от того, нужен ли вам сценарий сбоев ViewData, жизнеспособным решением является использование отдельной главной страницы или сделайте следующее: How do I pass ViewData to a HandleError View?

Смежные вопросы