Рендеринг нескольких представлений с нескольких контроллеров на одной странице - PullRequest
2 голосов
/ 08 марта 2009

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

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

После поиска в Google я нашел RenderAction метод, который почти идеален, но он недоступен в RC1, только в Futures, и, по-видимому, у него есть некоторые проблемы.

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

Дополнительные уточнения:

Основная причина, по которой мне не нужна логика доступа к данным в контроллере Home, - это избегать повторения кода и логики. Я буду использовать 5 лучших новостей на нескольких страницах / контроллерах. Я не хочу повторять поиск данных в каждом из них. Я уже сделал много логики и проверки для бизнес-уровня. Решение, которое мне нужно, это RenderAction или UserControls, как в классическом ASP. Я знаю, что могу использовать их и в MVC, но ... какой в ​​этом смысл? Я имею в виду, что если то, что я спрашиваю, слишком сложно или слишком абсурдно (повторно используемые компоненты пользовательского интерфейса), то MVC определенно не для меня, и я бы посчитал, что он серьезно уступает классическому ASP.NET, потому что это требование действительно простое.

Ответы [ 3 ]

1 голос
/ 08 марта 2009

Хотя я могу понять желание не дублировать функциональность на нескольких контроллерах, я не понимаю нежелание вашего контроллера Home взаимодействовать с DAL. Я думаю, что частичное представление определенно является подходящим вариантом. Мое решение, не дублирующее функциональность, заключается в том, чтобы вставить код, который генерирует данные для различных представлений, в ваш бизнес или уровень данных. Затем вы можете ссылаться на него из каждого из необходимых действий контроллера, которые используют частичные представления. Помещение его в бизнес-уровень может изолировать контроллер от уровня данных, если это то, что вы хотите, но я все еще думаю, что это правильная работа действия контроллера по получению и предоставлению данных для представления.

Другим потенциальным решением было бы заполнить представление, сгенерированное вашим домашним контроллером, через обратные вызовы Ajax для различных действий контроллера, которые генерируют необходимые компоненты представления. Недостатком этого является то, что он не работает изящно при отсутствии JavaScript в браузере.

EDIT

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

1 голос
/ 08 марта 2009

То, что вы просите, - это в основном не выполнять доступ к данным в HomeController, это выглядит как догматический подход. Я хотел бы рассмотреть возможность использования RenderAction из сборки Futures (не уверен, что с ним не так, я использую его в ряде проектов) или SubControllers из MvcContrib .

0 голосов
/ 08 марта 2009

Если вы действительно не хотите использовать RenderAction, тогда единственная другая опция, которую вы имеете, - это загрузить необходимые фрагменты данных с помощью фильтров действий. Ваш домашний контроллер может выглядеть так:

public class HomeController : Controller
{
    [RequireNews]
    [RequireQuotes]
    [RequireCart]
    public ActionResult Index()
    {
        return View();
    }
}

Эти фильтры действий можно использовать повторно там, где они необходимы. Вы также можете разместить их на самом классе контроллера.

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