ViewModel Dynamic em ASP.Net MVC 3

by Felipe Oriani 9. setembro 2010 05:42

Olá amigos, neste post vou abordar um novo recurso que estará disponível no Asp.Net MVC 3 (atualmente no Preview 1) que é a possibilidade de termos propriedades dinâmicas no ViewData (ViewModel no Asp.Net MVC 3). Antes de abordar o tema principal do post, vamos entender como o ViewData trabalhou trabalha no Asp.Net MVC.

Todo controller em ASP.Net MVC deve herdar diretamente (por default) ou indiretamente de uma classe base chamada “Controller” que está debaixo de System.Web.Mvc para que o framework consiga entender que tal classe é um Controller. Como todos sabem, controllers possuem métodos que podem ser chamados de “Actions” que definem o tipo e qual View será renderizada, e em alguns momentos desejamos passar alguma informação para esta View. Para isso, uma propriedade publica na classe Controller chamada ViewData é responsável por enviar informações para que possam ser acessadas na View.

Esta propriedade ViewData que é do tipo  IDictionary<string, object> (classe concreta ViewDataDictionary) é um objeto do que através de uma chave (string) retorna qualquer objeto (object). Por um lado, isto facilitou muito a vida dos desenvolvedores pois podemos passar qualquer informação para a View sendo que o tipo Object é o tipo básico pra qualquer objeto em .Net. Por outro lado gerou conflitos, pois além de não ser type safe (ou tipado, ter a garantia que aquela instância é de determinado tipo, havendo a necessidade de realizar uma conversão), alguns erros podem passar despercebidos como os índices podem ser “strings mágicas”.

Com isso, foi implementado uma nova propriedade chamada ViewModel na classe controller, que é do tipo dynamic (novo recurso disponível a partir do .Net Framework 4.0) que permite que você defina propriedades em tempo de execução e o compilador as resolve para nós definindo o tipo, ou seja, quando fazíamos:

 

ViewData["Mensagem"] = "Olá Mundo ViewData";

 

Agora podemos fazer:

 

ViewModel.Mensagem = "Olá Mundo ViewData";

 

Perceba que ViewModel é outra propriedade, ou seja, ViewData ainda existe porém não contém recursos de type safe, já a ViewModel pelo fato de ser do tipo dynamic, conseguimos definir uma propriedade qualquer e aplicar um valor, como neste exemplo onde definimos uma propriedade chamada “Mensagem” e aplicamos a string  “Olá Mundo ViewModel” fazendo com que dinamicamente o .Net Framework identifique e a crie para nós tal propriedade de tal tipo; Na View conseguimos recuperar ambos os valores tanto como ViewData como ViewModel.

A vantagem disso é que agora temos uma propriedade específica para aplicar ViewModel (boa prática comum até a versão 2.0 do Asp.Net MVC). Podemos utilizar o ViewModel com propriedades dinâmicas a fim de ter maior segurança que tal tipo será retornado durante o processo de execução. Para ilustrar vamos a um exemplo.

Imagine que em nosso projeto temos uma página que irá listar os produtos de um catálogo. Para tanto precisaremos de uma classe produto em nosso Modelo, que defini da seguinte forma:

public class Produto
{
   public string Nome { get; set; }
   public decimal Valor { get; set; }
 
   public Produto(string nome, decimal valor)
   {
      this.Nome = nome;
      this.Valor = valor;
   }
}

Em seguida desejamos listar produtos em nossa página, então poderíamos fazer algo do tipo em uma Action:

 

public ActionResult Index()
{
   ViewModel.Titulo = "Produtos do Catálogo"; 
   ViewModel.Produtos = ObterProdutos();
 
   return View();
}

 

No código acima, definimos uma propriedades chamada Produtos que é inicializada a partir de um método chamado ObterProdutos() que retorna um IEnumerable<Produto>. Em nossa View, conseguimos recuperar a propriedade Produtos e iterá-la pelos objetos:

 

<h2><%: View.Titulo %></h2>
   
<% foreach (var produto in View.Produtos) { %>
   <%: produto.Nome %> - <strong><%: produto.Valor.ToString("C2") %></strong><br />
<% }%>

 

O resultado:

  

 

Bem, era isso que gostaria de mostrar.

Em minha opinião este recurso irá facilitar muito, pois não vejo mais a necessidade de ficar criando ViewModel para cada View.

Espero que gostem!
Abraços

 

Referências:
http://haacked.com/archive/2010/08/02/dynamic-methods-in-view-data.aspx
http://www.asp.net/mvc

Download do exemplo: Mvc3Dynamic.zip (319,37 kb)

Tags: , , ,

ASP.Net MVC

Comentários (3) -

Rick
Rick Brazil
5/7/2011 03:33:07 #

Opa! Muito bom post!

Porém, no comecinho, você escreveu "ViewData" duas vezes:
" ... ou seja, quando fazíamos:
1 ViewData["Mensagem"] = "Olá Mundo ViewData";

Agora podemos fazer:
2 ViewData["Mensagem"] = "Olá Mundo ViewData";

Perceba que ViewModel... "


Valeu! ;)

Felipe Oriani
Felipe Oriani Brazil
5/7/2011 03:39:06 #

Fala Rick, obrigado pelo comentário. Na época deste post ainda estavamos no asp.net mvc 3 beta, portanto muita coisa mudou. Hoje a propriedade foi renomeada de ViewModel para ViewBag, portanto, desconsidere tudo o que você ler como ViewModel, e leia como ViewBag. Farei um post em breve com mais detalhes da ViewBag.

Abraços!

Acacio
Acacio Brazil
22/8/2011 06:48:39 #

Olá Felipe.
Tenho uma dúvida, será que você consegue me ajudar?
Quero criar uma pagina em mvc onde tenha mais de uma fonte de dados.
Ex.: Dados de uma string de conexão como nome, tipo, timeout e outra com os parametros da mesma.Como implementar essas 2 fontes de dados em um unico public ActionResult Index()???

Obrigado

Comentar

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading

Sobre

Sou Felipe Oriani e trabalho com desenvolvimento web desde 2004, com tecnologias Microsoft como Asp e Asp.Net utilizando as linguagens C# e Vb.Net. Bacharel em Ciência da Computação pela Escola de Engenharia de Piracicaba,  MCTS (.Net Framework 3.5, ASP.NET Applications). Conheça um pouco mais sobre meu CurrículumVeja mais 

Social

profile for Felipe at Stack Overflow, Q&A for professional and enthusiast programmers

Selos

MCTS .Net Framework 3.5, ASP.NET Developer

MCP - Microsoft Certified Professional