2009-11-11 5 views
5

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

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

ответ

3

3 Опции:

  1. RenderAction весь путь.

  2. RenderPartial as Ryan ответил.

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

3

Вы можете использовать Рендер Action из MVC Future's библиотеки, если вы хотите иметь свой собственный контроллер, и т.д. для меню, кроме от использования основной модели представления.

+1

Я считаю, что вы имеете в виду RenderAction не RenderPartial из сборки Futures. –

+0

Вы правы, спасибо - я редактировал публикацию. :) –

1

Вы в основном есть два варианта:

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

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

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

+0

Библиотека MVC Contrib хороша, но может быть проще просто использовать библиотеку MVC Future's от Microsoft, если все, что требуется, - это возможность рендеринга частичных файлов. –

0

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

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

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

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

0

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

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

3

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

0

Чтобы добавить к этому, RenderAction был добавлен в MVC2 Beta.

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