2010-01-01 5 views
9

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

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

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

ответ

1

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

Я думаю, у вас мог бы быть Контроллер вопросов, имеющий методы вроде View, Edit, Create и т. Д. Это, кажется, имеет смысл, особенно для проекта - a Q & Сайт.

1

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

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

/Controller/Action /: идентификатор

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

+0

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

+0

Контроллер также проверяет информацию, введенную в систему? –

+0

@ D.Shawley - Я думаю, что вы раскалываете волосы, но вы правы, я не упоминал, что контроллер обновляет модель, а также запрашивает ее. Тем не менее, я бы сказал, что контроллер должен специально стоять между моделью и представлением, так как вполне возможно, что модель и представление свяжутся напрямую. Причина, по которой вы не хотите, это поддерживать де-мутацию. Де-связь возникает из-за реализации контроллера (модератора). – ennuikiller

1

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

Если мы строим его со следующими организациями и отношений

пользователя

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

Вопрос

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

Ответ

  • Принадлежит пользователю
  • Belogns на вопрос

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

  • UsersController - Сделки с Update Создание и удаление пользователей
  • QuestionsController - сделки с Update Создание и удаление Вопросы
  • AnswersController - Сделки с Update Создание и удаление Ответы

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

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

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

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

2

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

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

Мое взятие на 1:

Поскольку этот тип вопроса поддается многим конфессионально ответов, я считаю, что нет «один способ управлять ими всеми». Теперь в Monorail и ASP.NET MVC (и, конечно же, RoR) контроллер является просто набором действий. Правильный вопрос: «Какова роль действия»?

В моей книге (неписаная книга с монорельсом в действии ... :)) роль Действия состоит в том, чтобы отделить модель домена от презентации как с точки зрения структур данных, так и в вопросах. Все, что специализируется на том, что интерфейс с доменом осуществляется через WEB-запросы, является ответственностью уровня контроллера. Это включает в себя привязку данных и преобразования, связанные с аутентификацией (но не), и принятие решений для шаблонов представления. Таким образом, действие будет принимать параметры из входящего запроса (в сети не проблема с доменом), привяжите их к содержательным данным, которые могут быть отправлены в домен как запрос или команду на языке домена, без cookies, FORM, QueryString и другие «веб-материалы». Он также при просмотре данных преобразует объекты домена, которые были возвращены из Модели, в модель просмотра, которая в той же книге, упомянутой ранее, является моделью, отделенной от модели домена, и отвечает за предоставление представления -template со всеми данными и принятием решения. Так, например, вид не должен запрашивать if (view.User.IsAdmin) и отображать кнопку «РЕДАКТ», но вместо этого действие Контролера будет отвечать на этот вопрос и предоставит представление с решением, для представления спросить if (view.ShouldRenderEditButton)

So , слой Controllers отделяет проблемы WEB от проблем DOMAIN.

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

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

3

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

Здесь поток:

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

Ниже картина объясняет процесс более легко:

alt text http://www.shopno-dinga.com/dustbin/mvc.png

+1

Где находится фотография? –

+0

Взгляните на http://heim.ifi.uio.no/~trygver/themes/mvc/MVC-2006.gif для лучшей диаграммы MVC от одного из ее изобретателей. –

+0

Линия между моделью и контроллером с надписью «данные» должна действительно находиться между моделью и представлением. Контроллер управляет моделью, а Вид наблюдает за моделью. –

0

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

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

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

ОСТАЛЬНЫЕ короче:

  • каждый ресурс имеет глобальный идентификатор (URL)
  • каждый ресурс имеет общий набор методов (УДАЛИТЬ, GET, POST, PUT)
  • приложение REST является без гражданства (без состояния сеанса между запросами)

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

  • простой
  • унифицированный; легко понять для новых разработчиков, прост в использовании для разработчиков-клиентов
  • можно использовать с несколькими клиентами, такими как браузеры, агрегаторы подачи, веб-сервисы ...
  • REST использует всю мощь http без накладных расходов (по сравнению с веб-службами SOAP)
Смежные вопросы