Как отобразить несколько виджетов на одной странице с помощью MVC - PullRequest
10 голосов
/ 03 ноября 2008

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

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

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

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

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

Ответы [ 7 ]

2 голосов
/ 03 ноября 2008

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

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

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

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

MVC не означает, что есть ОДИН вид и ОДИН контроллер. Это просто означает, что логика приложения хранится в моделях, контроллер склеивает вещи, и представление строит отображение. Это формальное и логическое разделение логики и представления.

2 голосов
/ 03 ноября 2008

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

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

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

1 голос
/ 19 февраля 2009

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

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

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

1 голос
/ 03 ноября 2008

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

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

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

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

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

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

0 голосов
/ 19 февраля 2009

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

Я знаю субконтроллеры как иерархические MCV ( HMVC ). Идея состоит в том, что вы «вытягиваете» контент (представление, заполненное субконтроллером) из родительского шаблона представления вместо «выталкивания» данных в шаблон из контроллера. Таким образом, вместо того, чтобы редактировать контроллер и представление для добавления виджета, вы просто вызываете виджет из представления. Для этого есть библиотеки в php-фреймворках CodeIgniter (Modular Extensions) и Kohana (Dispatch и Component).

0 голосов
/ 06 ноября 2008

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

Взгляните на этот сеанс с 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());
}
0 голосов
/ 03 ноября 2008

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

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