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)