Меня интересует общий подход к созданию интерактивного графического интерфейса с использованием MVC3.
Идея состоит в том, чтобы создать набор различных компонентов, которые можно интегрировать (подключать) в различные сценарии.
Каждый компонент ДОЛЖЕН иметь собственное определение модели, контроллер и представления. Компонент инкапсулирует не только представление, но и поведение через свой контроллер.
Все детали внутренней реализации, модель, поведение и т. д. должны находиться внутри компонента, чтобы компонент стал независимым, модульным — черным ящиком. Это позволяет изменять компонент, ничего не нарушая в контексте, в котором используется компонент.
Контекст, в котором выполняется компонент, не должен делать никаких предположений о внутренних деталях реализации компонента.
С другой стороны, компонент не делает никаких предположений о контексте, в котором он будет использоваться.
Наконец, компонент должен предоставлять механизм для «общения» или «взаимодействия» с внешним миром. Помимо внутренних компонентов, компонент должен предоставлять какой-то «внешний» интерфейс (например, параметры, данные, функции, события и т. д.), который позволил бы интегрировать компонент в контекст выполнения.
Контекст (или сценарий) — это часть, содержащая компоненты. Теперь основной задачей контекста является управление взаимодействием между компонентами.
Пример из реальной жизни компонента "Категории":
Компонент отображает список категорий и позволяет пользователю выполнять различные действия, такие как сортировка, пейджинг и выбор записи. Внутри у него есть собственная модель, в которой хранится соответствующая информация, такая как текущая страница, сортировка, выбор и т. д. Внутри он реализует все необходимые действия (для базового рендеринга, для ответа на действия пользователя и т. д.) в своем собственном контроллере. Внутри он обрабатывает сохранение состояния модели в представлении и восстановление состояния модели в своем собственном контроллере.
Реальный пример компонента Products:
Компонент отображает список продуктов и позволяет пользователю выполнять различные действия, такие как сортировка, разбиение по страницам и выбор записи. Внутри у него есть собственная модель, в которой хранится соответствующая информация, такая как текущая страница, сортировка, выбор и т. д. Внутри он реализует все необходимые действия (для базового рендеринга, для ответа на действия пользователя и т. д.) в своем собственном контроллере. Внутри он обрабатывает сохранение состояния модели в представлении и восстановление состояния модели в своем собственном контроллере.
Реальный пример страницы информационной панели (контекст, сценарий):
На странице отображаются компоненты «Категории» и «Продукты». Компонент «Продукты» отображает все продукты для текущей выбранной категории и, следовательно, должен предоставлять внешний интерфейс (параметр или что-то еще) для получения идентификатора выбранной категории из контекста. Компонент категорий должен предоставлять какой-либо внешний интерфейс, чтобы контекст мог действовать при изменении выбранной категории и предоставлять идентификатор выбранной категории для компонента продуктов.
Технически коммуникационный подход для обновления страниц в основном будет проходить через AJAX, но если это возможно без AJAX, это было бы даже лучше.
В случае с AJAX мне хотелось бы решение, в котором используются контроллеры на стороне сервера, которые решают и отображают то, что должно быть обновлено на клиенте (JSON или что-то в этом роде).
Мне бы не понравилось решение в клиентском скрипте (контроллер типа "как" на стороне клиента), который решает, какие действия вызывать и какие части страницы обновлять - это, как сказано в предыдущем абзаце, должно решаться контроллером ( с) на сервере.
Важно: Компоненты не обязательно должны работать при прямом вызове через какой-либо маршрут.
Как бы вы вообще реализовали описанную систему?