ASP.NET MVC Model vs ViewModel

92

OK, tenho ouvido discussões sobre "ViewModels" em relação ao ASP.NET MVC da MS.

Agora, isso pretende ser um tipo específico de modelo, correto? Não é um tipo específico de visão.

No meu entendimento, é uma espécie de Model que tem o propósito específico de interagir com a View? Ou algo assim?

Agradecemos alguns esclarecimentos.

Qcom
fonte

Respostas:

71

Essencialmente, Model e View Model são classes simples com atributos.

O objetivo principal dessas classes é descrever (para "Modelar") um objeto para seus respectivos públicos que são respectivamente o controlador e a visualização.

Então você está completamente certo quando diz

No meu entendimento, é uma espécie de Model que tem um propósito específico de interagir com a View

Portanto, embora as classes de Model sejam efetivamente Entidades de Domínio com as quais seu aplicativo interage, View Models são classes simples com as quais suas views interagem.

Espero que ajude :)

Atualização :

A Microsoft desenvolveu uma versão especializada do Presentation Pattern por Martin Fowler amplamente baseada no Model-View-Controller e chamou-o de Model-View-ViewModel (MVVM) para aplicativo PF. Esse padrão é direcionado a plataformas de desenvolvimento de UI modernas, nas quais os desenvolvedores de UI possuem diferentes requisitos baseados mais na lógica de negócios do que os desenvolvedores tradicionais. Dê uma olhada aqui para um pouco de teoria

Lorenzo
fonte
1
OK, obrigado, e também obrigado pela atualização, isso é muito útil! Portanto, sem levar em conta a versão especial da MS, com MVC 2 padrão, você coloca os ViewModels em uma pasta especial designada? Ou eles estão simplesmente colocados na pasta Modelos como qualquer outro. Ou você pode fazer qualquer um?
Qcom
Você é bem vindo. Normalmente coloco modelos e vejo modelos na mesma pasta porque quero agrupá-los em relação ao domínio ao qual eles se referem, mas essa é apenas minha escolha e tenho certeza de que há melhores
Lorenzo
5
ViewModel deve separar View do (domínio) Model. Portanto, faz sentido colocar ViewModel perto de View, não perto de Model.
Vitaliy Ulantikov
Eu manteria minhas classes 'Model' fora do meu projeto MVC ao invés de em uma pasta Model - eu, entretanto, manteria as classes View Model dentro do projeto MVC, de forma que, como Vitaliy diz, elas ficariam perto da View.
Dan Harris
@Lorenzo Em sua primeira linha, você diz "ambas as classes simples com atributos". Eu acho que você quer dizer com propriedades? Se não, a quais atributos você se referia? Atributos vs. Propriedades
xr280xr
69

Em termos mais simples, gosto de pensar no seguinte:

Modelo: estritamente parece e se parece com seu modelo de dados. Para todos os efeitos, é apenas uma representação de classe de seu modelo de dados. Ele não tem conhecimento de sua Visualização ou de quaisquer elementos em sua Visualização. Dito isso, ele não deve conter nenhum decorador de atributo (ou seja, necessário, comprimento, etc.) que você usaria para sua visualização.

View Model: Serve como um aglutinante de dados entre sua View e seu Model e, em muitos casos, também é um wrapper para seu Model. Ele seria tornado inútil sem o View, portanto, normalmente não é reutilizável em vários Views e Controllers como um Model padrão é.

Por exemplo, seu modelo pode ter as seguintes propriedades, que são representações diretas de sua fonte de dados:

    public string FirstName { get; set; }
    public string LastName { get; set; }

Agora, como seu modelo de visualização está vinculado à sua visualização, ele pode ter a seguinte propriedade - que concatena os campos FirstName e LastName do modelo juntos como uma string:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
Jason Marsell
fonte
2
Você poderia fornecer um exemplo mais completo do ViewModel? Como ele sabe o que é meuModelo e como ele obtém dados para meuModelo?
M Kenyon II
5
Por natureza, um ViewModel é um objeto C # antigo simples (POCO) e nunca saberá realmente como é o seu modelo de dados. É mais um híbrido de seu modelo de dados e elementos específicos que sua visualização precisa exibir. No que diz respeito a como ele obtém dados, você deve carregá-lo com os dados. Eu gosto de usar uma classe intermediária separada, onde chamo meu serviço para os dados e, em seguida, carrego manualmente esses dados em meu ViewModel. Em seguida, retorno o ViewModel totalmente carregado à ação do controlador.
Jason Marsell
26

Achei este artigo um recurso muito útil para entender como o "Modelo de Domínio" e o "Modelo de Visualização" interagem em um aplicativo MVC, principalmente no que diz respeito à vinculação. O melhor de tudo inclui exemplos em vez de descrições abstratas.

"Desde que o MVC foi lançado, observei muita confusão sobre a melhor forma de construir modelos de visualização. Às vezes, essa confusão não é sem um bom motivo, pois não parece haver uma tonelada de informações sobre as recomendações de práticas recomendadas. Além disso, não há uma solução “tamanho único” que atua como a bala de prata. Neste post, descreverei alguns dos principais padrões que surgiram e os prós / contras de cada um. É importante observar que muitos desses padrões surgiram de pessoas que resolvem problemas do mundo real. "

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

misteraidan
fonte
19

WikiPedia tem uma descrição mais completa de Model vs. ModelView do que você obterá em uma resposta SO: http://en.wikipedia.org/wiki/Model_View_ViewModel

Eu cito:

Modelo : como no padrão MVC clássico, o modelo se refere a (a) um modelo de objeto que representa o conteúdo de estado real (uma abordagem orientada a objetos), ou (b) a camada de acesso a dados que representa esse conteúdo (uma abordagem centrada).

Visualização : como no padrão MVC clássico, a visualização se refere a todos os elementos exibidos pela GUI, como botões, janelas, gráficos e outros controles.

ViewModel : o ViewModel é um “Model of the View”, o que significa que é uma abstração da View que também serve na vinculação de dados entre a View e o Model. Ele pode ser visto como um aspecto especializado do que seria um Controlador (no padrão MVC) que atua como um aglutinador / conversor de dados que transforma informações de Modelo em informações de Visão e passa comandos de Visão para o Modelo. O ViewModel expõe propriedades públicas, comandos e abstrações. O ViewModel foi comparado a um estado conceitual dos dados em oposição ao estado real dos dados no Model.

Ian Mercer
fonte
3
Embora haja uma descrição de Model e ViewModel, esse link descreve apenas o padrão de arquitetura MVVM. Não as diferenças entre Model e View Models
Lorenzo
5

Existe uma noção de ViewModel, mas geralmente não é associado ao Asp.net MVC. MVC usa o padrão Model View Controller, onde o controlador lida com interações, constrói dados do Model e então passa esses dados para a View para exibição.

ViewModels (e o padrão Model View ViewModel) é mais geralmente associado ao Silverlight e WPF. O Xaml é um pouco diferente, pois as visualizações podem fazer vinculação bidirecional aos ViewModels, portanto, a tecnologia é um pouco diferente. Por exemplo, se você vincular uma caixa de texto a um campo, conforme você digita nessa caixa de texto, o valor do campo é atualizado dinamicamente. Esse tipo de interação não é realmente possível em páginas da web, pois as páginas da web não têm estado.

A semelhança entre os dois padrões é que ambos estão tentando separar a lógica da tela. O uso / motivo mais comum para isso é o teste: você deseja ser capaz de executar a partir do código (por meio de uma estrutura de teste) todas as interações que um usuário invocará por meio da interface do usuário.

tsimon
fonte
No livro que estou lendo, "Professional ASP MVC 2", ViewModel é apresentado no Capítulo 1 como um meio de manter interações de apresentação / modelo fortemente tipadas e DRY. Os autores da microsoft incluem Scott Hansleman, Phil Haack, Scott Guthrie.
Berryl
Eu tenho visto muito mais, ultimamente, que o ViewModel está sendo usado no Asp.net MVC. parece que o ViewModel tem mais negócios na visão do que o Domain Model. Portanto, o padrão que estamos usando é fazer com que os modelos de domínio montem as partes principais do ViewModel. Atualmente, usamos um padrão de comando modificado (operações) que funcionam com os modelos de domínio para realizar suas tarefas. Os resultados são reunidos no ViewModel e enviados para a visualização. O modelo de visualização, neste caso, contém todas as anotações e a lógica simples e focada que oferece suporte à visualização.
Sinestésico