O controlador deve passar dados para uma visualização no padrão MVC?

11

Eu trabalho com o ASP.NET MVC (e outras implementações de MVC baseadas na Web) com bastante frequência, mas é algo de que nunca tive certeza: O controlador e a exibição devem se comunicar?

É claro que o controlador deve escolher qual visualização usar, mas o que quero dizer com isso deve passar os dados para a visualização? Na minha opinião, se a visualização está esperando dados do controlador, eles estão efetivamente vinculados como um par (controlador, visualização). Em vez disso, normalmente tenho a visão de comunicar com o modelo e ser independente de qualquer controlador.

Eu tenho a abordagem correta ou é este o caso de não haver uma resposta correta? A resposta muda quando se trabalha na web versus outros ambientes? A resposta muda quando você tem o conceito de uma exibição fortemente tipada (como no ASP.NET MVC) ou não?

Andy Hunt
fonte
É para isso que serve o "M" em "MVC" - o Modelo - que representa os dados que estão sendo transmitidos do Controlador para a Visualização.
Jay Sullivan

Respostas:

7

O controlador prepara os dados que serão passados ​​para a exibição para renderização / exibição. Ele também aceita dados de entrada do usuário por meio de um mecanismo de publicação-assinatura ou similar. Confira o primeiro diagrama na Wikipedia ou no site de Martin Fowler para obter mais informações sobre o MVC.

se a visualização espera dados do controlador, eles são efetivamente vinculados como um par (controlador, visualização).

Embora uma visão geralmente aceite dados, na maioria das estruturas MVC, ela não depende de controladores específicos. Exceções são, por exemplo, a família JavaServer Faces. De um modo geral, estruturas como Rails, Django ou Spring MVC permitem dissociar visualizações de controladores passando dados (o contexto, geralmente um mapa / dicionário / bolsa) para uma exibição (onde uma exibição é uma implementação do padrão de exibição de modelo ).

A resposta muda quando você tem o conceito de uma exibição fortemente tipada (como no ASP.NET MVC) ou não?

O fato de sua linguagem de programação ser fortemente digitada não influencia a maneira como você está organizando seu aplicativo.

BenR
fonte
Que tipo de dados está sendo preparado e transmitido? Tome um exemplo simples: mostrando um artigo por seu ID. É o ID que é passado após a verificação (pode não apontar para um artigo) ou o controlador obtém o artigo do banco de dados e o passa?
Andy Hunt
Se você apenas passar o ID, sua visualização não está mais funcionando do que renderizada? Teria que recuperar dados que provavelmente não estariam no espírito do padrão.
Rig
1

A pergunta que você está levantando é discutida em minha equipe de tempos em tempos. Argumentamos sobre duas abordagens, que têm seus contras e prós.

O primeiro, argumenta que o controlador pode atualizar a visualização pelo seguinte padrão. Ele escuta os eventos da GUI e do modelo. Quando um evento da GUI ocorre, ele executa a ação necessária no modelo, que por sua vez é acionado e evento. Agora, o controlador geralmente está atualizando a visualização com os dados necessários.

A segunda abordagem, argumenta que a própria exibição está ouvindo os eventos do modelo e se atualiza com os dados anexados ao evento ou consultando o modelo.

Na primeira abordagem, você tem mais poder para o controlador, que realmente controla tudo o que está acontecendo na sua aplicação. O poder de decidir de que maneira a visão deve ser atualizada de acordo com o evento que está em suas mãos e assim você mantém sua visão pura. No entanto, como você disse, dessa forma, você tem sua visão e controlador acoplados.

No segundo, você os está desacoplando, mas sua visão está realmente se controlando de alguma maneira.

Assimiz
fonte