Понимание контроллеров в MVC

Я создаю сайт, подобный StackOverflow, главным образом как осуществление изучения, и я испытываю затруднения при понимании, как выбрать различные контроллеры в шаблоне MVC.

Что такое точно контроллер? Какие контроллеры Вы использовали бы для моделирования веб-сайта Вопросов и ответов, подобного ТАК? Я использую ASP.NET MVC, и я замечаю, что шаблон URL всегда "/Controller/Action" - но это определенно не, как я хотел бы, чтобы заключительные URL были похожи ("/Question/123", не вписывается в тот шаблон). Это - соображение?

Я знаю, что это - на самом деле соединение нескольких вопросов..., возможно, в чем я действительно нуждаюсь, хорошее учебное руководство для понимания основ.

9
задан tereško 30 May 2013 в 07:37
поделиться

7 ответов

Проще говоря, контроллер - это контракт/мост между моделью и видом.

Вот поток:

Контроллер используется для основной логики обработки запроса. Если страница должна общаться с БД, контроллер посылает запрос модели, модель выполняет свою задачу с db и возвращает некоторый ответ или записи db обратно в контроллер, после чего контроллер посылает этот ответ в представление.

На рисунке ниже процесс объяснен проще:

alt text
(источник: shopno-dinga.com)

3
ответ дан 4 December 2019 в 21:49
поделиться

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

Я думаю, у вас мог бы быть контроллер "Вопросы", имеющий такие методы, как "Вид", "Редактирование", "Создание" и т.п. Похоже, в этом есть смысл, особенно для проекта - сайта вопросов и ответов

.
1
ответ дан 4 December 2019 в 21:49
поделиться

Многие сочли эту дискуссию очень полезной:

Что входит в "контроллер" в "MVC"?

1
ответ дан 4 December 2019 в 21:49
поделиться

Контроллер в архитектуре MVC отвечает за запрос модели данных и предоставление данных для просмотра. Причина, по которой контроллер вообще должен иметь контроллер, заключается в том, чтобы поддерживать де-связь между моделью и представлением. Общепризнано, что развязка или отсутствие связи между компонентами в системе ОО желательны и необходимы. Это поддерживает возможность многократного использования и инкапсуляции, и, следовательно, способствует ремонтопригодности.

Шаблон MVC при использовании в контексте успокоительного веб-приложения будет поддерживать a контроллер, который обрабатывает urls со следующим форматом:

/Controller/Action/:id

Так что для просмотра одного вопроса, скажем, вам бы пришлось: /questions/view/123. Великолепную запись о разработке успокаивающего веб-приложения (на основе deli, li, cious) можно найти здесь.

.
1
ответ дан 4 December 2019 в 21:49
поделиться

Я смотрю на это так - все, что вам нужно, чтобы выполнить действия на контроллере или с необходимостью. Например, в Q/A сайте может быть что-то вроде...

Если мы построим его со следующими сущностями и отношениями

Пользователь

  • имеет много вопросов
  • имеет много ответов

Вопрос

  • Принадлежит пользователю
  • Имеет много ответов

Ответ

  • Принадлежит пользователю
  • Блоги к вопросу

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

  • UsersController - действия по обновлению и удалению пользователей
  • QuestionsController - действия по обновлению и удалению пользователей

    • UsersController - действия по обновлению и удалению пользователей
    • . Вопросы
    • AnswersController - Обновление и удаление информации о создании Ответы

    Ваши контроллеры будут иметь больше методов, чем упомянутые.

    Следующий бит немного сложноват, так как это не JUST модели, для которых вы хотите использовать контроллеры (и некоторые модели, для которых вы хотите использовать контроллеры). Если у вас будет пользователь, входящий в систему, то я создам контроллер сеансов, который будет работать с входом и выходом из системы.

    Попробуйте подумать, какие сущности будет составлять ваша система, и записать их. Затем подумайте, с какими из них вы будете выполнять действия. Затем можно подумать о дополнительных контроллерах, таких как контроллер сеансов.

    И далее обратите внимание, что модели - это в основном объекты/сущности вашей системы, контроллеры выполняют действия с этими сущностями, а представления отображают модель.

    .
1
ответ дан 4 December 2019 в 21:49
поделиться

Контроллер формирует границу системы, которая является http-интерфейсом вашего приложения. Он принимает запрос, запускает обработку запроса и возвращает результат клиенту.

Вы можете поместить все действия, принадлежащие определённому классу доменных объектов, в один контроллер. Это приведет к указанному шаблону URL /$контроллер/$экшен. Я бы предложил использовать REST. При использовании REST вы думаете не о "контроллерах" и "экшенах", а о "ресурсах". Каждый ресурс имеет общий набор методов, а именно DELETE, GET, POST и PUT. Эти методы являются HTTP глаголами. У вас будет больше ресурсов, чем у контроллеров с не-REST подходом, но общее количество экшенов будет одинаковым.

В вашем примере одним ресурсом будут "вопросы", которые будут представлять собой список всех вопросов. Для создания нового вопроса клиент посылал бы http-запрос типа "POST /questions $formdata". Новый объект вопроса будет создан и добавлен в список. Клиент получит перенаправление на созданный вопрос "перенаправить /questions/4128", а затем загрузит его с помощью "GET /question/4128".

REST вкратце:

  • каждый ресурс имеет глобальный id (URL)
  • каждый ресурс имеет общий набор методов (DELETE, GET, POST, PUT)
  • приложение REST не имеет статуса (нет состояния сеанса между запросами)

Преимущества:

  • просто
  • унифицировано; легко понятно для новых разработчиков, просто в использовании для клиентов-разработчиков
  • удобно с несколькими клиентами, такими как браузеры, агрегаторы лент, веб-сервисы . ...
  • REST использует всю мощь http без накладных расходов (по сравнению с веб-сервисами SOAP)
0
ответ дан 4 December 2019 в 21:49
поделиться

Давайте распустим свой вопрос в два:

  1. Какова роль контроллера в MVC вкус, предлагаемый Monorail и ASP.NET MVC?
  2. Как сопоставления URL относятся к применительному действиям?

Мои взять 1:

Как этот тип вопроса поддается многим религиозным ответам, я считаю, что Нет «Один из способов править их всех». Сейчас в монорельсе и ASP.NET MVC (а также ROR конечно), контроллер - это просто сбор акций. Правильный вопрос тогда: «Какова роль действий»?

В моей книге (неписанная книга монораил-в действии ... :)), роль действия состоит в том, чтобы отделить доменную модель от презентации , как с точки зрения структур данных, так и в опасении. Все, что специализируется на том факте, что интерфейс с доменом проходит через веб-запросы, является ответственностью слоя контроллера. Это включает в себя связывание и преобразование данных, связанные с аутентификацией (но не авторизации) и принятия решений для шаблонов просмотра. Таким образом, действие будет принимать параметры из входящего запроса (в Интернете нет . Концерн домена), свяжите их к значимым данным, которые можно отправить домену в качестве запроса или команды, на языке домена , без печенья, формы, квитанции и других «веб-материалов». Он также при просмотре данных будет преобразовать доменные объекты, которые возвращаются из модели, в модель просмотра, что в той же книге, упомянутой ранее, это модель, разделенная с моделью домена, и отвечает за поставку Шаблон со всеми данными и решением, принимающим решение. Итак, например., Вид не должен просить , если (view.user.isadmin) и визуализация кнопки «редактирование», но вместо этого действие контроллера сделает этот вопрос и предоставила вид с помощью Решение, для просмотра, чтобы просить , если (View.shouldRenderededButton)

Итак, слой контроллеров разделяет веб-концерн от проблем домена.

Что касается вопроса нет. 2:

Идея отображения URL URL в качестве контроллера / действия является просто следствием принятия подхода «Конвенция о конфигурации». Значение, для разработчиков было бы легче работать с схемой, которая распространена в разных веб-приложениях. Сказав это, он не написан в камне, и, как и любая конвенция, это основа для адаптации. Поэтому, если вы строите веб-сайт, и менеджер продукта просит «красивые URL», то вы просто настроили свой двигатель маршрутизации соответственно.

2
ответ дан 4 December 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: