Asp.net MVC Система динамического меню - PullRequest
5 голосов
/ 11 ноября 2009

В нашем текущем приложении Asp.net MVC у нас есть 2 системы меню: одна сверху и одна слева. Теперь у нас есть частичное представление, которое отображает меню, однако является ли единственный способ для этой работы также вернуть элементы меню обратно с каждой отдельной моделью представления? Мы стараемся не использовать словарь ViewData.

Я думаю, что ответ на этот вопрос - да, однако я хочу посмотреть, что думают другие

Ответы [ 7 ]

3 голосов
/ 11 ноября 2009

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

3 голосов
/ 11 ноября 2009

3 варианта:

  1. RenderAction полностью.

  2. RenderPartial, как ответил Райан.

  3. Например, абстрактный MasterViewModel. Все ваши модели будут наследоваться от этого. Заполняется фильтром действий.

3 голосов
/ 11 ноября 2009
1 голос
/ 11 ноября 2009

У вас есть два варианта:

  1. Используйте ViewModel для настройки отображаемых пунктов меню, они будут доступны из любого представления, полного или частичного.

  2. Создайте иерархию строго типизированных моделей, поместите элементы меню где-нибудь в BaseModel, чтобы затем они присутствовали в каждой производной модели.

Возможно, вас заинтересуют асинхронные контроллеры или частичные запросы. Он не реализован в ASP.NET MVC, но вы можете проверить проект сообщества MVC Contrib , он имеет некоторую поддержку.

0 голосов
/ 19 ноября 2009

Просто чтобы добавить к этому, RenderAction был добавлен в бета-версию MVC2.

0 голосов
/ 11 ноября 2009

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

Недавно я написал в блоге с похожим подходом (мне нужно было отобразить список спонсоров на каждой странице). Это может помочь направить вас в правильном направлении.

0 голосов
/ 11 ноября 2009

Есть много вариантов для обработки этого, но мы нашли один очень простой способ справиться с этим, который не требует перестройки всего приложения.

У нас были аналогичные проблемы, когда наша страница / частичное имеет четко определенный тип ViewData.Model, но представление содержит частичное, которое повторно используется на нескольких страницах. Мы также старались избегать использования ViewDataDictionary.

Однако мы обнаружили, что именно тот случай, который вы описываете, является сценарием EXACT, в котором нам нравится использовать запись ViewDataDictionary. Мы сохраняем статический класс Constants в нашей модели приложения, который содержит внутренние классы для каждого типа констант, включая ключи ViewData, чтобы у нас не было строк для этих вещей, плавающих повсюду.

Затем наше действие Controller заполняет ключ ViewData и частичное внутри другой страницы / частичное проверяет существование этого ключа и использует его вместо ViewData.Model. Это делает частичную работу везде, где это необходимо, и поддерживает вашу ViewModel в чистоте. Используя константы, мы везде избегаем необработанных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...