Какие вещи можно вставить в контроллер в MVC? - PullRequest
2 голосов
/ 19 ноября 2011

Я просматривал статьи, описывающие паттерн MVC. Никто из них не дал четкого объяснения роли Контроллера в MVC. Некоторые говорят, что Controller может вносить изменения в представление, такие как отключение кнопки или изменение цвета текста, тогда как некоторые говорят, что любые изменения в представлении должны быть сделаны только внутри представления. Не могли бы вы дать мне советы по следующему вопросу?

1) Можно ли сделать какие-либо изменения, относящиеся к представлению, внутри контроллера?

2) Что не должно быть написано внутри контроллера?

3) Правильно сказать: «Представление должно выполнять все изменения самостоятельно, когда модель генерирует новый набор записей, так как представление запрашивает модель напрямую, а контроллер не участвует в этой транзакции?»

4) Я слышал это утверждение о MVC "В текущей версии разработки приложений для Windows. View способен обрабатывать событие (например, нажатие кнопки), и при необходимости вызывается контроллер. Глупо делегировать событие, слушающее контроллер сейчас. " Разве это не похоже на MVP?

Спасибо. Надеюсь получить помощь здесь.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

1) Ответственность контроллера заключается в основном «выполнить действие, выбрать соответствующее представление, предоставить некоторые данные для этого представления и вернуть представление пользователю».

2) Поскольку MVC пытается разделить логику представления и рендеринг пользовательского интерфейса, я считаю, что контроллер не должен пытаться выполнять какие-либо из обязанностей по просмотру: прослушивание событий пользовательского интерфейса или предварительное форматирование значений dateString = data.ToString('YYYY-MM') - это все, что нужно вид.

3) в представлении MVC известно все о модели - модель отображается представлением без какого-либо участия контроллера (это основная «проблема», устраняемая MVP, когда представление должно и модель должны быть связаны как можно больше). Однако для просмотра не рекомендуется запрашивать модель напрямую. Вместо этого следует сообщать обо всех изменениях данных для просмотра по модели с использованием шаблона Observer. Рассмотрим следующее - схема из статьи в википедии - пунктирная линия от модели к представлению указывает на этот факт. Просто помните, что модель здесь больше viewmodel и не должна быть частью слоя BL.

Так что здесь сценарий может быть следующим:

  • Пользователь нажимает кнопку «Добавить элемент»
  • Просмотр отправляет запрос контроллеру с данными элемента
  • Контроллер вызывает BL, который вносит изменения в модель (добавляет новый элемент в список).
  • Модель запускает «обновленное» событие для представления (или «ошибка», если есть проблемы в нижележащих слоях)
  • Просмотр обновлений интерфейса в соответствии с зарегистрированными изменениями.

4) Утверждение совершенно верно. В MVC вы не должны этого делать. Я полагаю, что в MVP вы не должны этого делать - я имею в виду, слушая события непосредственно из интерфейса. Это должно быть сделано либо путем пересылки события по представлению; или используя представление представления, не зависящее от платформы, например

inderface IMyGridView
{
    event ItemEvent AddItemClick;
}

(что не имеет смысла для MVC, поскольку представление в значительной степени не зависит от контроллера, и в основном все действия представления приводят к вызовам контроллера).

0 голосов
/ 20 ноября 2011

На мой взгляд:

1) Контроллер изменяет данные, предоставленные для представления, поэтому, в некотором смысле, да.Представление должно просто управлять представлением данных, предоставленных ему контроллером.

2) Контроллер должен содержать весь код для обработки любых действий, предпринятых пользователем.В зависимости от размера вашего приложения контроллер может передать действие на бизнес-уровень для выполнения работы, а затем собрать данные представления после завершения бизнес-уровня и вернуть его обратно в представление.Или, если у вас нет бизнес-уровня, он может выполнять работу напрямую.

3) В истинном MVC представление не должно иметь прямого доступа к модели.Контроллер должен создать представление объектов из модели и передать их в представление.В любом случае представление не должно никогда выполнять какую-либо реальную работу, кроме презентации.

4) Я не знаю MVP, поэтому не могу ответить на этот вопрос.

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