2009-03-08 3 views
2

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

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

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

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

Дополнительные разъяснения:

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

ответ

1

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

+0

Dogmatic? Я просто пытаюсь не повторять много кода вокруг ... – mitch

+0

Ну, тогда за дизайном есть решение для дизайна. Попробуйте создать еще один слой между контроллером и DAL, возможно, BLL. –

1

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

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

EDIT

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

+0

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

0

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

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

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

+1

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

+0

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

+0

RenderAction по своей сути опасен, так как вы не знаете, какой результат действие вернется, возможно, что-то иное, чем частичный вид , Использование фильтров или создание общего кода генерации данных в базовом контроллере - лучший способ убедиться, что данные просмотра доступны для частичных. – tvanfosson

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