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ê.

mvc3_01
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.

mvc3_02

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!