Как отображать несколько виджетов на одной странице с помощью MVC

Я немного смущен тем, как работает MVC, и я не могу найти ничего, кроме базовых примеров.

Я хочу создать своего рода дизайн на основе виджета; вы можете выбрать различные виджеты, чтобы перейти на свою страницу. Каждый виджет должен отвечать за себя - он должен иметь контроллер и представление. Но как насчет главной страницы? Внезапно у меня есть страница с большим количеством контроллеров!

Очевидное, что нужно сделать, это встроить контроллеры в представление как-то... This is my widget {SomeWidget}, но я прочитал, что "нарушает парадигму MVC".

Некоторым виджетам потребуется POST для разных URL-адресов (например, окно поиска переходит на страницу результатов), а некоторые из них должны будут возвращать POST на тот же URL-адрес (например, добавление комментария к статье приводит вас к статье).

В первую очередь, пользователь должен иметь возможность редактировать HTML вокруг виджета - например, если они хотят окно поиска справа, они могут набирать <div style="float: right;">{SearchController}</div> (в моем мире, нарушающем парадигму)

Ответ 1

Я не очень хорошо разбираюсь в веб-программировании, но, на мой взгляд, из примера, который вы описали, должна быть одна модель, один вид и один контроллер для всей страницы. Теперь само представление должно содержать представления для каждого виджета на странице (и то же самое относится к контроллеру страницы), на который он отправляет сообщения, которые он получает.

Концептуально существует более низкий уровень MVC (для виджетов) и более высокий уровень MVC (для страницы). И парадигма MVC не будет нарушена. Теперь вы можете редактировать HTML вокруг виджета, он изменяет модель страницы (а не любую модель виджета).

Надеюсь, это поможет!

Ответ 2

Чтобы добавить к комментарию @Benoît:

Структура Symfony обрабатывает это с помощью компонентов. Каждый компонент представляет собой автономный экземпляр MVC, который может быть встроен в другое представление. Он не может быть создан для ответа непосредственно на веб-запросы, такие как обычный экземпляр MVC (пара модулей/действий). Он может быть встроен только в другое представление MVC.

В качестве побочного примечания: Symfony также рассматривает плагины как свой собственный полный экземпляр MVC с его собственной схемой, моделями, контроллерами, конфигурационными файлами, представлениями и т.д.

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

MVC не означает, что есть один вид и один контроллер. Это просто означает, что логика приложения хранится в моделях, контроллер склеивает все вместе, а представление создает экран. Это формальное и логическое разделение логики и представления.

Ответ 3

Одна из лучших, коротких и простых книг, которые я нашел на MVC, - это тот, который был выпущен на прошлой неделе на выставке PDC 2008:

http://www.apress.com/book/view/1430216468

Он охватывает не только концепцию MVC, но и ее сравнение с другими концепциями, такими как Ruby on Rails и методология MVP.

Кроме того, он касается всей причины, по которой MVC существует, описывая его разделение проблем и почему он должен быть не только на уровне пользовательского интерфейса, но и в ваших реальных слоях или структуре IoC для ваших бизнес-объектов и DAL.

Я бы очень рекомендовал эту книгу, поскольку он описывает лучшие практики всего лишь на 110 страницах.

И нет, я не работаю для FirstPress или вообще не связан с ними. Мне просто понравилась книга, и, наконец, с кем я согласен.

Ответ 4

Лучшая информация, которую я нашел при создании виджетов в ASP.NET MVC, находится на блоге Стив Сандерсон. Он объясняет свою концепцию частичных запросов, которая является другим методом, чем субконтроллеры.

http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/

Частичные запросы просты. Вы слышали о частичных представлениях, поэтому как насчет частичные запросы? В любом MVC запросите, вы можете создать коллекцию внутренних частичных запросов, каждый из который может создать собственную внутреннюю частичные запросы и т.д. каждый частичный запрос делает простой старый метод действия в любой из ваших простых Регулярные контроллеры, и каждый может создать независимый виджет. Я называя их частичными "запросами" чем "контроллеры", поскольку они запускают надлежащий трубопровод для обработки запросов MVC совместимый с вашей маршрутизацией системы и вашего контроллера factory. Тем не менее, как и в случае субконтроллеров, все контроль остается в контроллерах и представление может быть невежественным.

Ответ 5

Есть много вариаций в теме MVC и многое, что нужно рассмотреть, прежде чем приступать к выводу о дизайне вашей конкретной системы. Большинство новейших популярных веб-систем выглядят IoC в качестве руководящего принципа. Обычно какой-то компонент инфраструктуры - это контроллер, который использует какую-то конфигурацию для вызова правильного шаблона в виде представления и сопоставления его с соответствующей иерархией объектов в качестве модели. Большинство из этих систем включают расширяемую библиотеку виджета GUI, которая будет использоваться шаблонами. Вы можете добавить свои собственные виджеты, но не лучше всего жестко закодировать ваши виджеты на определенную иерархию объектов. Эта ссылка IoC также рассказывает о компонентах и ​​услугах, которые должны дать вам некоторое руководство о том, как избежать этого жесткого кодирования.

Ответ 6

ASP.NET MVC хорошо подходит для страницы типа mashup на панели виджетов.

Взгляните на этот сеанс из PDC 2008.

Вероятно, вы захотите использовать помощники Ajax для обновления островов данных в каждом виджете. Вот фрагмент того, как вы могли бы поместить калькулятор на любую страницу, но не заставлять код независимым.

Просмотр фрагмента:

<script type="text/javascript">
    function OnFailure(error) {
        alert("We have encounterd an error " + error);
    }
</script>
<% using (Ajax.BeginForm("Add", new AjaxOptions{UpdateTargetId="sum", OnFailure="OnFailure"})){ %>
    <%= Html.TextBox("x") %>&nbsp;+&nbsp;
    <%= Html.TextBox("y") %>&nbsp;=&nbsp;
    <span id="sum">?</span>
    <input type="submit" value="AddEm" />
<% } %>

Флажок контроллера:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(string x, string y)
{
    int sum = int.Parse(x) + int.Parse(y);       
    return Content(sum.ToString());
}

Ответ 7

Я думаю, что ответы JarrettV и jcoby наиболее близки.

Я познакомился с субконтроллерами как иерархический MCV (HMVC). Идея состоит в том, что вы "вытаскиваете" контент (представление, заполненное субконтроллером) из родительского шаблона представления, а не "нажимаете" данные на шаблон из контроллера. Поэтому вместо того, чтобы редактировать и контроллер, и вид, чтобы добавить виджет, вы просто вызываете виджет из представления. Есть библиотеки для этого в PHP-интерфейсах CodeIgniter (Модульные расширения) и Kohana (Dispatch, and Component).