Stack Overflow em Português Asked on November 13, 2021
Estou acostumado com a abordagem MVC de frameworks como CakePHP e Laravel. Agora que estou me aprofundando no ASP.NET MVC, eu gostaria de entender pra que serve essa ViewModel.
Qual é o objetivo das ViewModels?
Farei uma analogia que eu acho que fica muito fácil entender o que é uma view model.
Pensa em um banco de dados, mas só como relação metafórica, não que precise ter relação entre eles. O model da sua aplicação MVC é a tabela do banco de dados. O view model é o equivalente ao que conhecemos de view no banco de dados. Simples, né?
No CakePHP e no Laravel o conceito é este? Se for, no ASP.NET MVC ou Core (que eu aconselho mais) é a mesma coisa.
Inclusive o AP já teve uma prévia sobre o uso de views do SQL no MVC, onde a abordagem era um pouco diferente.
Claro, há diferenças concretas entre os conceitos, mas basicamente é isto.
Como o nome diz, model view é um modelo da visão.
O que é o modelo normal, o M do MVC?
Ele determina quais são os dados que estarão disponíveis para você na base dados que está trabalhando. Note que não falei de banco de dados, base pode ser de qualquer forma.
O modelo pode ser usado diretamente na view sem problema algum.
Imagino que entenda bem que a view é onde tem a real apresentação dos dados.
Porém em qualquer coisa que saia de CRUD muito simples, e até mesmo em alguns casos assim, o modelo não pode ser usado de forma direta de forma simples. Precisaria fazer malabarismo para funcionar. Em alguns casos nem conseguiria funcionar.
A solução é criar um modelo "alternativo" que será usado na visão. Ou seja view model é um modelo que só atende a necessidade específica de uma ou mais visões. Podemos dizer que é igual ao model puro, mas ele não se vincula diretamente à base de dados.
Na view model você criar uma estrutura com os dados que usará na view, que pode ser apenas o subconjunto de campos do modelo, pode ter campos criados sob demanda que serão facilmente usados na view (lembrando que a views não deveria ter processamento a não ser para controlar sua própria construção). Mas também pode disponibilizar dados de outros objetos do model adotado. Geralmente o MVC não tem mecanismo para passar objetos diferentes pra view de forma direta, é preciso criar um novo modelo com o que precisa.
Lembrando que view models costumam ser criadas no controlador, mesmo que indiretamente.
É quase duplicata de View Model deve ter classes relacionadas?.
Mais informação sobre o MVVM onde foi inspirado o seu uso, mas lá de uma forma mais completa.
Tem um exemplo legal em resposta no SO. A view model:
public class CountyViewModel {
[HiddenInput]
public int? CountyId { get; set; }
[DisplayName("County Name")] [StringLength(25)]
public string CountyName { get; set; }
[DisplayName("County URL")] [StringLength(255)]
public string URL { get; set; }
}
public class ListAllCountiesViewModel {
public string CountyName { get; set; }
public IEnumerable<County> ListAllCounty { get; set; }
}
public class PropertyViewModel {
public ListAllCountiesViewModel _listAllCountyViewModel { get; set; }
public CountyViewModel _countyViewModel { get; set; }
}
Answered by Maniero on November 13, 2021
Em C# tudo precisa de um tipo. Bem, atualmente, até é possível trabalhar de forma mais dinâmica, mas não é o ponto. Tipos são definidos por classes.
No ASP.NET MVC tem-se o costume de tipar as views também. Ou seja, você define que uma view vai receber um objeto e que este objeto deve ser de um determinado tipo que, como já dito, é definido por uma classe.
Partindo deste ponto, vou tentar explicar usando um exemplo, pra ficar mais fácil de visualizar.
Imagine que você tem um modelo (um tipo, uma classe) que representa uma tabela do banco de dados chamado de pessoa.
public class Pessoa { }
Agora imagine que esta pessoa pode ter um nome e um ou mais carros, logo, a classe Pessoa
vai ter duas propriedades
public class Pessoa
{
public string Nome { get; set; }
public List<Carro> Carros { get; set; }
}
E a classe carro é definida da seguinte forma
public class Carro
{
public string Modelo { get; set; }
}
Bem, agora imagine que você tem a seguinte tarefa: criar uma view que mostre o nome de todas as pessoas cadastradas e o modelo de todos os seus carros separados por vírgula.
Você pode simplesmente criar uma view usando o tipo Pessoa
e fazer o tratamento dos modelos dos carros no próprio código Razor.
@model List<Pessoa>
@foreach(var pessoa in Model)
{
<p>@(pessoa.Nome) - @(string.Join(", ", pessoa.Carros.Select(c => c.Modelo)))</p>
}
Ótimo, está pronto, mas seria um tanto mais inteligente da sua parte se você enviasse pra view apenas um tipo que contenha duas strings. Aí que entra a tal view model.
public class PessoaCarrosViewModel
{
public string NomePessoa { get; set; }
public string ModelosCarros { get; set; }
}
Seguindo esta ideia, o código da view ficaria
@model List<PessoaCarrosViewModel>
@foreach(var pv in Model)
{
<p>@(pv.NomePessoa) - @(pv.ModelosCarros)</p>
}
Obviamente que em algum ponto do código vai ter que existir uma forma de mapear um conjunto de dados (models, por exemplo) para uma view model.
É claro que meu exemplo é extramente simplório e, provavelmente, nem seria realmente necessário o uso de uma view model, mas a ideia dela é justamente esta, você ter um tipo que contém informações mescladas de outros tipos para apresentar na view.
Answered by Jéf Bueno on November 13, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP