Fala galera tudo tranks?
Antes de darmos continuidade aos posts sobre WCF, gostaria de apresentar a vocês o mais novo preview do Asp Net MVC 3.
Para que vocês possam acompanhar o post da melhor forma possível, abaixo segue o link para download do primeiro preview, clique aqui.
O Asp .NET MVC 3 será compatível com a sua versão anterior, o Asp .NET MVC 2, contudo, isso não significa que será fácil atualizar os projetos que você está escrevendo com o MVC 2 para o MVC 3 quando eles lançarem a versão final.
As funcionalidades do Asp .Net MVC 3 tem como base as funcionalidades do Asp .Net MVC 1 e 2, ou seja, todo seu conhecimento adquirido em sites e livros não serão perdidos, isso porque, as funcionalidades do Asp .Net MVC 1 e 2 não se tornaram obsoletas.
Ok Luciano, mas a pergunta de todos é: “Posso instalar o Asp .Net MVC 3 junto com o ASP.NET MVC 2?”, a resposta é sim, você pode, inclusive a versão preview, sem que esta impacte projetos existentes da versão do Asp .Net MVC 2 que você esteja trabalhando, eles continuarão a usar o Asp .Net MVC 2 a menos que você modifique os projetos para que estes passem a usar o Asp .Net MVC 3.
Quando você instalar a versão "Preview 1", você terá um novo conjunto de templates de projeto para o Asp.Net MVC 3 que aparecerão na janela de diálogo de Novo Projeto do Visual Studio 2010.
Vamos ver algumas das novas funcionalidades e capacidades do Asp .Net MVC 3. Ressalvo que tudo que fizermos aqui são funcionalidades da versão 3 do Asp Net MVC, isso não quer dizer que novas funcionalidades não possam sair em versões futuras.
View
O Asp.Net MVC 3 "Preview 1" inclui um conjunto de melhorias específicas para a View.
Janela de Diálogo
Foi criada uma nova janela de diálogo "Add->View", que torna mais fácil sua escolha quanto a sintaxe a ser utilizada. Ela permite que você selecione qualquer um dos motores de exibição disponíveis que estejam instalados na sua máquina, o que lhe dá a habilidade de usar qualquer abordagem de modelagem de visão que pareça mais natural para você.
Figura 01 – Nova janela Add View
Nova Engine Razor
Não irei entrar em detalhes sobre a Engine Razor, isso porque daria outro post, então, sugiro que vocês deem uma lida no post do Scott Guthrie sobre o Razor
Controller
Assim como para a View, o Controller também ganhou algumas novidades:
Filtros Globais
O Asp.Net MVC 3 suporta a capacidade de aplicar de forma declarativa lógica "contínua" usando um mecanismo chamado de "filtros". Você pode especificar filtros nos controladores e métodos de ação hoje usando uma sintaxe de atributo conforma a listagem 1.
Listagem 01 – Filtros
[HandleError]
[LoaderOptimization(128)]
public ActionResult Index()
{
ViewModel.Message = "Aplicação Asp.Net MVC 3";
return View();
}
Muitas das vezes precisamos aplicar filtros a todos os controladores de uma aplicação, com o Asp .Net MVC 3, foi adicionado um método chamado RegisterGlobalFilters que irá adicionar os filtros à coleção GlobalFilters. Basta fazer a chamada no Application_Start() do seu Global.asax.
Listagem 02 – Filtros Globais
public static void RegisterGlobalFilters( GlobalFilterCollection filters )
{
filters.Add( new HandleErrorAttribute() );
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters( GlobalFilters.Filters );
RegisterRoutes( RouteTable.Routes );
}
O Asp .Net MVC 3 é flexível no que diz respeito a filtros, de modo que você pode configurar um filtro global que será aplicado condicionalmente apenas se forem respeitadas determinadas condições. Por exemplo, se a depuração estiver habilitada; se uma requisição usar um verbo http dentre outras. Os filtros também podem ser resolvidos a partir de um Conteiner.
ViewModel Dinâmico
Os Controladores do Asp.Net MVC suportam uma propriedade "ViewData" que permite a você transmitir dados para uma View usando uma coleção (Dictionary) como na listagem 03.
Listagem 03
ViewModel["Message"] = "Aplicação Asp.Net MVC 3";
Já na versão 3 do MVC, foi adotada a propriedade dinâmica, dynamic, ela permite que você use o novo
suporte à linguagem dinâmica tanto do VB quanto do C# para passar itens da ViewData usando uma sintaxe um pouco mais limpa do que aquela utilizada com a API de dicionário atual. Observe a figura 2, a propriedade Message só será conhecida em tempo de execução.

Figura 02 – Dinamismo
ActionResult
As novidades não param por ai! O Action Result também ganhou novas funcionalidades:
HttpNotFoundResult
A nova classe HttpNotFoundResult é usada para indicar que um recurso solicitado pela URL atual não foi encontrado. Ela retorna um código de status HTTP 404 para o cliente que realizou a chamada. Opcionalmente, você pode usar o novo método de ajuda HttpNotFound() no controlador para retornar uma instância desse tipo de resultado de ação, conforme a listagem 4.
Listagem 04
public ActionResult RecuperaProduto(int codProduto)
{
var prod = new Produto.Find(codProduto);
if ( prod == null )
return HttpNotFound();
return View();
}
Redirecionamentos Permanentes
A classe HttpRedirectResult tem uma nova propriedade "Permanent" do tipo booleano que é usada para indicar se um redirecionamento permanente deve ocorrer. Um redirecionamento permanente usa o código de status HTTP 301. Em conjunto com esta mudança, a classe Controller tem agora três novos métodos para realizar redirecionamentos permanentes: RedirectPermanent(), RedirectToRoutePermanent(), e RedirectToActionPermanent().
Esses métodos retornam uma instância do tipo HttpRedirectResult com a propriedade Permanent definida com true.
HttpStatusCodeResult
A nova classe HttpStatusCodeResult pode ser usada para definir um código de status e descrição de resposta de forma explícita.
Ajax e Javascript
Dando continuidade às novidades, o Asp.Net MVC 3 inclui suporte para JSON, o que permite que os métodos recebam dados codificados no formato JSON podendo assim, vinculá-los como parâmetros dos métodos.
Observe o código da listagem 5, ele define um manipulador de eventos "save" que será chamado quando um botão salvar for clicado no lado cliente. O código dentro do manipulador de eventos irá criar um objeto "produto" no código JavaScript com dois campos, cujos valores são obtidos a partir de elementos de entrada HTML. Em seguida, ele usa o método .ajax() da jQuery para postar (POST) uma requisição baseada em JSON que contém o produto para uma URL /Store/UpdateProduct no servidor.
Listagem 05 – método Ajax
$("#save").click(function () {
var prod = {
NomeProduto: $("#ProdName").val(),
Valor: $("#value").val()
};
$.ajax({
url: "/Store/UpdateProduct",
type: "Post",
data: JSON.stringify(prod),
dataType: "json",
contentType: "application/json; charset=utf-8",
sucess: function () { $("message").html("Produto atualizado").fadeIn() },
error: function () { $("message").html("Erro ao atualizar o Produto").fadeIn() }
});
return false;
});
No lado servidor você terá algo como na listagem 6.
Listagem 06 – Atualizar Produto
public ActionResult UpdateProduct(Produto produto)
{
//Implementar a lógica para atualização de um produto
return null;
}
Validação do Modelo
No Asp.Net MVC 2, houveram algumas melhorias no que diz respeito à validação, no Asp .Net MVC 3, este trabalho foi estendido e ainda por cima eles adicionaram suporte para vários outros novos recursos de validação e os introduziram no namespace System.ComponentModel.DataAnnotations do .NET 4. São eles:
- Suporte aos novos atributos de metadados – DataAnnotations, tais como DisplayAttribute.
- Suporta as melhorias feitas na classe ValidationAttribute no .NET 4. A classe ValidationAttribute foi melhorada no .NET 4 para suportar uma sobrecarga nova IsValid que fornece mais informações sobre o contexto de validação corrente, permitindo saber por exemplo qual é o objeto que está sendo validado. Isso permite cenários mais ricos, onde você pode validar o valor atual baseando-se em outra propriedade do modelo.
- Suporta à nova interface IValidatableObject introduzida no .NET 4. A interface IValidatableObject permite a execução de validação no nível do modelo, e permite que você forneça mensagens de erro de validação específicas para o estado geral do modelo, ou entre duas propriedades do modelo.
Na listagem 7, podemos ver como utilizar a a interface IValidatableObject nativa no .NET 4 para implementar um método de validação personalizado em uma classe.
Listagem 07 – Implementando IValidatableObject
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if ( string.IsNullOrEmpty( NomeProduto ) )
return (IEnumerable<ValidationResult>) new ValidationResult("Você deve preencher o campo Nome do Produto");
return null;
}
Além da interface IValidatableObject, o Asp.Net MVC 3 também apresenta uma nova interface chamada IClientValidatable que permite descobrir em tempo de execução se um validador tem suporte para a validação no lado do cliente. Esta interface foi projetada de modo que possa ser integrada com uma variedade de frameworks de validação.
Dependency Injection
O Asp.Net MVC 3 nos dá um melhor suporte para aplicação de injeção de dependência (DI) e integração com Conteiners de injeção de dependência.
Para a versão "Preview 1", foram adicionados suporte para injeção de dependência nos seguintes locais:
- Controladores (registro e injeção de fábricas de controladores, injeção de controladores)
- Visões (registro e injeção de motores de visão, injeção de dependências em páginas de visão)
- Filtros de Ação (localização e injeção de filtros)
Para futuras versões, poderão ser acrescentados os seguintes suporte para injeção de dependência em:
- Model Binders - Vinculadores de Modelo (registro & injeção)
- Value Providers - Provedores de Valor (registro & injeção)
- Validation Providers - Provedores de Validação (registro & injeção)
- Model metadata Providers - Provedores de Metadados de Modelo (registro & injeção)
Ufa, finalmente terminei, acho que vocês não viam a hora né!!
Como podem ver, as melhorias são muitas, isso na versão Preview 1 heim!! Imagina o que vem por ai. Espero poder postar a vocês tudo que for novidades no Asp .Net MVC 3.
É isso ai galera, até o próximo post!
Enjoy!