Метод RenderPartial () в ASP.NET MVC обладает очень низким уровнем функциональности. Он не предоставляет и не пытается обеспечить истинную модель «субконтроллера» *.
У меня все больше элементов управления, отображаемых с помощью RenderPartial (). Они делятся на 3 основные категории:
1) Элементы управления, которые являются прямыми
потомки конкретной страницы, которая
использовать модель этой страницы
2) Элементы управления, которые являются прямыми
потомки конкретной страницы, которая
использовать модель этой страницы с
дополнительный ключ какого-то типа .
Думаю реализация
'DataRepeater'.
3) Элементы управления, которые представляют собой не связанные
функциональность на странице они появляются
на. Это может быть что угодно от
ротатор баннеров, к форме обратной связи,
поиск магазина, регистрация в списке рассылки.
Ключевым моментом является то, что это не волнует
на какую страницу он ставится.
Из-за того, как работает модель ViewData
, существует только один объект модели на запрос - то есть все, что нужно субконтролю, должно присутствовать в модели страницы.
В конечном счете, команда MVC, как мы надеемся, выйдет с настоящей моделью «субконтроллера», но до тех пор я просто добавляю в модель главной страницы все, что также необходимо дочерним элементам управления.
В случае (3) выше это означает, что моя модель для «ProductModel» может содержать поле для модели «MailingListSignup». Очевидно, что это не идеально, но я принял это в лучшем компромиссе с существующей структурой - и с наименьшей вероятностью «закрою все двери» для будущей модели субконтроллера.
Контроллер должен нести ответственность за получение данных для модели, потому что модель должна быть просто глупой структурой данных, которая не знает, откуда она получает свои данные. Но я не хочу, чтобы контроллер создавал модель в нескольких разных местах.
То, что я начал делать, - это создание фабрики для создания модели. Эта фабрика вызывается контроллером (модель не знает о фабрике).
public static class JoinMailingListModelFactory {
public static JoinMailingListModel CreateJoinMailingListModel() {
return new JoinMailingListModel()
{
MailingLists = MailingListCache.GetPartnerMailingLists();
};
}
}
Итак, мой актуальный вопрос: как другие люди с такой же проблемой создают модели. Какой будет лучший подход для будущей совместимости с новыми функциями MVC?
- NB: Есть проблемы с
RenderAction()
, которые я не буду здесь рассматривать - не в последнюю очередь, это только в MVCContrib и не будет в RTM-версии ASP.NET-MVC. Другие проблемы вызвали достаточных проблем , которые я решил не использовать. Итак, давайте теперь притворимся, что существует только RenderPartial()
- или, по крайней мере, это то, что я решил использовать.