Должен ли контроллер передавать данные в представление в шаблоне MVC?


11

Я работаю с ASP.NET MVC (и другими веб-реализациями MVC) довольно часто, но в этом я никогда не был уверен: должен ли контроллер и представление взаимодействовать?

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

Правильный ли у меня подход, или это тот случай, когда нет единого правильного ответа? Меняется ли ответ при работе в Интернете по сравнению с другими средами? Меняется ли ответ, когда у вас есть концепция строго типизированного представления (как в ASP.NET MVC) или нет?


Это то, для чего "M" в "MVC" - Модель, которая представляет данные, передаваемые из Контроллера в Представление.
Джей Салливан

Ответы:


7

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

если представление ожидает данные от контроллера, то они фактически связаны вместе как пара (контроллер, представление).

Хотя представление обычно принимает данные, в большинстве сред MVC оно не зависит от конкретных контроллеров. Исключениями являются, например, семейство JavaServer Faces. Вообще говоря, фреймворки, такие как Rails, Django или Spring MVC, позволяют отделить представления от контроллеров, передавая данные (контекст, обычно карту / словарь / пакет) в представление (где представление - это реализация шаблона представления шаблона ).

Меняется ли ответ, когда у вас есть концепция строго типизированного представления (как в ASP.NET MVC) или нет?

То, является ли ваш язык программирования строго типизированным, не влияет на организацию вашего приложения.


Какие данные готовятся и передаются? Возьмите простой пример: показать статью по ее идентификатору. Идентификатор передается после проверки (он может не указывать на статью) или контроллер получает статью из базы данных и передает ее?
Энди Хант

Если вы передаете только идентификатор, ваш взгляд не выполняет больше работы, чем рендеринг? Это должно было бы извлечь данные, которые, вероятно, не были бы в духе шаблона.
Рог

1

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

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

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

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

Во втором вы их отделяете, но ваш взгляд на самом деле контролирует себя каким-то образом.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.