RSS feed
Preview 1 da ASP.NET MVC V2 Lançada - ScottGu's Blog em Português

Preview 1 da ASP.NET MVC V2 Lançada

O time da ASP.NET acabou de lançar a preview pública da ASP.NET MVC Versão 2. Você pode fazer o download aqui.

A preview de hoje funciona com o .NET 3.5 SP1 e VS 2008, e pode ser instalada lado a lado na mesma máquina; assim como a ASP.NET MVC 1.0 (o que significa que não há conflito, e seus projetos da ASP.NET MVC 1.0 existentes não serão impactados se você a instalar). Se você tiver ambas ASP.NET MVC 1.0 e ASP.NET MVC 2.0 instaladas você verá dois modelos de projeto da ASP.NET MVC dentro da janela de diálogo "Novo Projeto" do Visual Studio 2008:

As notas de lançamento que acompanham o lançamento da Preview da ASP.NET MVC 2 detalham como fazer o upgrade de projetos ASP.NET MVC 1.0 existentes de modo que estes passem a usar a V2 se você quiser migrá-los para aproveitar os novos recursos.

Novos Recursos

A ASP.NET MVC V2 incluirá muitas novas capacidades e recursos (alguns deles já foram detalhados na página de futuras adições da ASP.NET MVC. O lançamento de hoje da "Preview 1" contém uma primeira impressão de alguns destes recursos. Muitos novos recursos aparecerão nos lançamentos de futuras previews. Os bits da Preview 1 ainda são relativamente novos - o time está lançando este preview hoje para começar a receber e incorporar sugestões.

A seguir estão descritos rápidos detalhes sobre algumas das capacidades da Preview 1:

Suporte a Áreas

A ASP.NET MVC 2 inclui suporte a um novo recurso chamado "areas" (áreas) que permite a você particionar e agrupar funcionalidades mais facilmente dentro de uma aplicação MVC.

Áreas provê um meio para agrupar controladores e visões permitindo assim a construção de subseções em uma aplicação muito grande isolando-as de outras seções. Cada área pode ser implementada como um projeto ASP.NET MVC separado, o qual pode então ser referenciado pela aplicação principal. Isto ajuda no gerenciamento da complexidade na hora de construir uma grande aplicação e facilita o trabalho de múltiplos times que cooperam entre si em uma única aplicação.

A seguir está uma screenshot que mostra uma única solução que tem três projetos. Um dos projetos é chamado "CompanySite" e inclui o conteúdo principal do site, layout e controladores e visões. Existem então dois projetos "Area" separados - "Blogs" e "Forums". Estes projetos implementam a funcionalidade que existe para as seções das URLs /Blogs e /Forums dentro do site
– e encapsulam todas as regras de roteamento, controladores e visões implementando estas seções:

O lançamento da Preview 1 inclui a primeira parte da implementação do recurso de áreas. Esta preview ainda não inclui nenhuma ferramenta que suporta este recurso (atualmente você precisa adicionar manualmente uma tarefa de construção para criar um projeto área e configurá-lo). Versões futuras incluirão o suporte a ferramentas, e expandirão e refinarão o conjunto de recursos ainda mais.

Suporte à Validação de Dados através de DataAnnotation

A ASP.NET MVC 2 agora inclui suporte nativo para validação de dados através de DataAnnotation (Anotação de Dados) que primeiramente apareceu no .NET 3.5 SP1 – e a qual é usada com a ASP.NET Dynamic Data e os Serviços RIA do .NET. DataAnnotation provê uma maneira fácil para declarativamente adicionar regras de validação nas classes do Modelo e ViewModel dentro de uma aplicação de modo a ter a validação automática para os dados e métodos de ajuda da UI dentro da ASP.NET MVC.

Para ver este recurso em ação, nós podemos criar uma nova classe do tipo ViewModel chamada "Customer" (Cliente) igual a seguir que tem cinco propriedades (implementadas usando o recurso de propriedades automáticas da C#)

 

Nós podemos então decorar as propriedades com regras de validação apropriadas usando os atributos de DataAnnotation implementados dentro do namespace System.ComponentModel.DataAnnotations. O código a seguir usa 4 regras de validação nativas e diferentes – [Required] (Requerido), [StringLength] (Tamanho da String), [Range] (Limite), e [RegularExpression] (Expressão Regular). O namespace também inclui uma classe base (ValidationAttribute) que você pode herdar para criar seus próprios atributos de validação customizados.

Nós podemos então criar uma classe CustomersController que tem dois métodos de ação chamados Create, O primeiro método de ação Create trata as requisições HTTP GET para a URL “/Customers/Create” e renderiza um template (modelo) de visão baseado em um objeto Customer vazio. O segundo método de ação Create trata requisições HTTP POST para a mesma URL (e recebe um objeto Customer como parâmetro). Este verifica se existe algum erro de ligação de dados referente ao modelo para os dados de entrada submetidos pelo usuário, e se existem erros, o método mostra novamente o template da visão usando os dados já inseridos. Se não existem erros, o método mostra uma visão de sucesso para o usuário:

Finalmente, nós podemos clicar com o botão direito do mouse sobre qualquer um dos métodos de ação Create acima, escolher o comando do menu de contexto "Add View" (Adicionar Visão) e automaticamente "gerará" um template para a visão "create" que é baseado no objeto Customer. Quando nós fazemos isto o template da visão gerado conterá a tag HTML <form> a seguir para nosso Customer:

 

Agora quando nós requisitamos a URL “/Customers/Create” no nosso browser, nós teremos um formulário inicial vazio igual a seguir:

Se nós entrarmos com dados inválidos e fizermos um post para o servidor, o objeto responsável pela ligação dos dados do modelo (binder) da ASP.NET MVC 2 irá detectar que existem atributos DataAnnotation na nossa classe Customer, e automaticamente validará os dados enviados usando as regras de validação. Se existem erros, o nosso método de ação do controlador mostrará novamente o formulário – o quer fará com que as mensagens de erro apropriadas sejam exibidas para o usuário igual a seguir. Note como as strings de validação para as mensagens de erro que definimos usando atributos de DataAnnotation são mostradas para o usuário através dos métodos de ajuda Html.Validation. Nenhum código adicional é necessário para habilitar isto.

 

O formulário acima será reexibido com as mensagens de erro cada vez que o usuário inserir dados inválidos e tentar enviá-los para o servidor através de uma requisição post.

Em previews futuras da ASP.NET MVC 2 nós estamos planejando entregar o plugin de Validação da jQuery como parte do modelo padrão de projeto, e adicionar suporte automático para a aplicação de regras de validação do tipo DataAnnotation no lado do cliente através de JavaScript. Isto permitirá que os desenvolvedores adicionem regras de validação mais facilmente em um lugar, seja este o Modelo ou o objeto ViewModel, tendo estas regras aplicadas em ambos os lados (cliente e servidor) em qualquer lugar onde estas sejam usadas dentro da aplicação.

Se você não quiser anotar suas classes do Modelo ou ViewModel diretamente, você pode alternativamente criar uma “buddy class” (classe de ajuda) que acompanha sua classe do modelo e encapsula as regras de DataAnnotation separadamente. Esta capacidade é também útil em cenários onde o VS está gerando o código/atualizando as propriedades diretamente em uma classe e você não pode adicionar atributos ao código gerado automaticamente (por exemplo: classes geradas pelos motores de LINQ para SQL ou LINQ para Entidades).

Além de prover suporte nativo para DataAnnotations, a classe DefaultModelBinder na ASP.NET MVC V2 tem novos métodos virtuais que podem ser sobrescritos para facilmente integrar outros frameworks de validação (por exemplo: Castle Validator, EntLib Validation, etc). Os métodos de ajuda de UI para validação na ASP.NET MVC são projetados para suportar qualquer tipo de framework de validação (eles não têm conhecimento direto sobre DataAnnotations).

Métodos de Ajuda de UI Fortemente Tipificados

A ASP.NET MVC V2 inclui novos métodos de ajuda de UI que permitem a você usar expressões lambda fortemente tipificadas quando referenciar o objeto do modelo referente ao template da visão. Isto permite uma melhor verificação das visões no tempo de compilação (de modo que bugs podem ser encontrados no tempo de compilação ao invés de no tempo de execução), e também permite um melhor suporte à intellisense dentro dos templates das visões.

Você pode ver um exemplo do melhor suporte à intellisense em ação a seguir
– note como eu estou pegando uma lista completa com as propriedades do objeto Customer pertencente ao modelo quando estou usando o novo método de ajuda Html.EditorFor().

A Preview 1 tem suporte nativo para os novos métodos de ajuda Html.EditorFor(), Html.LabelFor() e Html.DisplayFor(). Um assembly da MVC futures atualizado que nós estamos entregando esta semana adiciona os métodos de ajuda Html.TextBoxFor(), Html.TextAreaFor(), Html.DropDownListFor(), Html.HiddenFor(), e Html.ValidationMessageFor() (com o passar do tempo estes métodos serão movidos para o assembly central da ASP.NET MVC 2 também).

A seguir você pode ver uma versão atualizada do template da visão "create" para o cenário de criação do nosso objeto Customer. Note como ao invés de usarmos expressões formadas por strings para referenciar o objeto Customer, agora nós estamos usando expressões lambda fortemente tipificadas com os métodos de ajuda de UI. Assim nós podemos ter suporte total para a intellisense e verificação de código no tempo de compilação com todos os métodos:

O método de ajuda Html.LabelFor() acima gera o marcação HTML <label for="Name">Name:</label>.

O método de ajuda Html.EditorFor() pode ser usado para qualquer valor de tipo de dado. Por padrão este é experto o bastante e irá gerar uma marcação HTML <input/> apropriada com base no tipo de dado a ser editado. Por exemplo, o método Html.EditorFor() gerará elementos <input type=”text”/> para as primeiras quatro propriedades acima (as quais são strings e inteiros). Este gerará um elemento <input type=”checkbox”/> para a propriedade final "IsActive" – a qual é do tipo boleano.

Além de suportar tipos de dados simples, o método de ajuda Html.EditorFor() também permite que você passe objetos mais complexos com múltiplas propriedades. Por padrão este método irá percorrer todas as propriedades públicas do objeto e gerará um elemento
<label>, <input/> e qualquer mensagem de validação apropriada para cada propriedade que este achar. Por exemplo, nós poderíamos reescrever a visão acima para termos somente uma única chamada a Html.EditorFor() para o objeto Customer, gerando conceitualmente a mesma marcação mostrada acima:

 

Os métodos de ajuda fortemente tipificados permitem a você opcionalmente decorar as propriedades da classe ViewModel do Customer com atributos [DisplayName] para controlar a string do label que será gerada para cada propriedade usada (por exemplo: ao invés de ter um texto para o label "IsActive" nós poderíamos aplicar um atributo [DisplayName(“Is Active Customer:”)]).

Você também pode adicionar atributos [ScaffoldColumn(false)] para indicar que uma propriedade particular não deve ser renderizada por completo em cenários iguais ao mostrado acima onde objetos complexos são passados para o método Html.EditorFor().

Suporte a Templates para os Métodos de Ajuda de UI

Os método Html.EditorFor() e Html.DisplayFor() possuem suporte nativo para renderização de ambos os tipos de dados padrão e complexos com múltiplas propriedades. Como notado acima, eles também suportam customização básica da renderização através da aplicação de atributos como [DisplayName] e [ScaffoldColumn] no ViewModel.

Geralmente os desenvolvedores querem ser capazes de customizar ainda mais a saída HTML gerada pelos métodos de ajuda de UI para ter total controle sobre o que é gerado. Os métodos de ajuda Html.EditorFor() e Html.DisplayFor() suportam isto através de um mecanismo de customização que permite a você definir templates externas que podem ser sobrescritas e completamente controlar a saída renderizada. Melhor ainda, você pode customizar o conteúdo renderizado com base no tipo de dado/classe.

Com a Preview 1 você pode agora opcionalmente adicionar uma pasta chamada “EditorTemplates” e/ou “DisplayTemplates” abaixo do diretório \Views\[controllername] (se você quiser customizar a renderização das visões usadas por um controlador específico) ou abaixo do diretório \Views\Shared (se você quiser customizar a renderização de todas as visões e controladores em uma aplicação).

Você pode então adicionar arquivos de templates parciais nestas pastas para customizar a saída renderizada para um tipo de dado individual e/ou classe. Por exemplo, a seguir eu adicionei uma pasta EditorTemplates abaixo da pasta \Views\Shared – e adicionei três arquivos de template customizados dentro desta:

O template "Customer.ascx" acima indica que eu quero customizar a saída em todos os momentos em que um objeto Customer for passado para o método Html.EditorFor() (por exemplo: eu poderia customizar a exata ordem de ordenação/layout para a renderização das propriedades do Customer). A template "DateTime.ascx" acima indica que eu quero customizar o HTML gerado em todos os momentos em que uma propriedade do tipo DateTime for passada para o método Html.EditorFor() (por exemplo: eu posso querer usar um selecionador de datas construído com JavaScript ao invés de um textbox comum). Eu poderia opcionalmente adicionar uma template adicional "Object.ascx" na pasta se eu quisesse sobrescrever a renderização padrão de todos os objetos.

Alem da customização da renderização com base no tipo, você também pode adicionar "templates" nomeadas na pasta. Um cenário comum pode ser um template "CountryDropDown" que trata o tipo de dado string – mas ao invés de prover uma textbox padrão este template renderiza uma tag <select> para uma dropdownlist de valores relativos ao campo country (país) de forma que o usuário possa fazer sua seleção. A seguir é mostrado o que este template para o editor pode proporcionar:

Nós podemos explicitamente indicar que nós queremos usar o template acima passando seu nome como um argumento quando invocamos o método de ajuda Html.EditorFor(). Por exemplo, a seguir, além de especificar a expressão lambda para nossa propriedade Country, nós também estamos especificando o nome do template que o editor deve usar quando renderizar a propriedade.


Alternativamente, você pode especificar atributos "UIHint" nas suas propriedades e tipos do ViewModel. Isto permite a você indicar em único lugar a template padrão para o editor ou display, e fazer com que este template seja usado em todas as visões em sua aplicação (sem ter que explicitamente passar essa informação como um argumento para o método Html.EditorFor()).

A seguir está um exemplo de como indicar o template usando o atributo UIHint para a propriedade Customer.Country (a qual é do tipo string). Esta propriedade deve usar por padrão o template CountryDropDown quando for renderizada:

Uma vez definido o atributo acima no nosso ViewModel, nós não precisamos mais especificar o nome do template explicitamente quando usarmos esta propriedade com o método de ajuda Html.EditorFor(). Agora quando nós clicarmos no botão refresh (atualizar) no browser para nossa URL /Customers/Create, nossa propriedade Country será renderizada como um dropdown (combobox) ao invés de um textbox comum.


Outros Recursos Maneiros

A Preview 1 da ASP.NET MVC 2 inclui vários recursos adicionais que embora pequenos, são extremamente legais. Alguns dos meus favoritos são:

Novo Atributo [HttpPost]

É muito comum na ASP.NET MVC termos que dividir o tratamento da URL em dois métodos de ação – um que trata as requisições GET e um que trata as requisições POST.

Com a ASP.NET MVC 1 você usava um atributo
[AcceptVerbs(HttpVerbs.Post)] para indicar a versão do "Post" de um método de ação:

Isto ainda funcionará com a ASP.NET MVC 2. Alternativamente a esta opção você pode agora tirar vantagem de um atributo mais resumido [HttpPost] que desempenha o mesmo papel:


Valores Padrão para Parâmetros

Tratar as opções de parâmetros é um cenário muito comum na web. Com a ASP.NET MVC 1 você podia tratar parâmetros opcionais registrando uma regra de roteamento customizada e especificando um valor padrão para esta, ou você marcava o parâmetro do método de ação como nullable (pode ser nulo) e então adicionava código dentro do método de ação para verificar se o parâmetro era ou não nulo (e se fosse, você provia um valor padrão).

A Preview 1 da ASP.NET MVC 2 agora suporta a decoração dos parâmetros do método de ação com o atributo
DefaultValueAttribute do namespace System.ComponentModel. Isto permite a você especificar o valor para o parâmetro que a ASP.NET MVC deve passar caso o valor do parâmetro não esteja presente como parte da requisição. Por exemplo, a seguir está um exemplo de como nós poderíamos tratar ambas as URLs  /Products/Browse/Beverages e /Products/Browse/Beverages?page=2 – fazendo com que o valor do parâmetro "page" seja "1" se este não for provido como parte da querystring (string de pesquisa):

A linguagem VB hoje permite que você especifique valores padrão para os parâmetros diretamente dentro da linguagem (evitando assim a necessidade de especificar explicitamente o atributo DefaultValue igual ao mostrado acima). A linguagem C# no VS 2010 também suportará valores padrão através de parâmetros opcionais – o que permitirá a você reescrever o código acima simplesmente como:


Isto deve tornar o tratamento de cenários que usam valor padrão/opcional realmente mais fácil e limpo.

Atribuindo Dados Binários

A Preview 1 da ASP.NET MVC 2 adiciona suporte para a atribuição de valores de string do tipo base64-encoded em propriedadeas do tipo byte[] e System.Data.Linq.Binary. Existem agora duas versões de sobrecarga para o método Html.Hidden() que aceitam estes tipos de dados. Estes tipos de dados podem ser úteis em cenários onde você quer habilitar o controle de concorrência dentro de sua aplicação retornando para o servidor valores do tipo timestamp das linhas do banco de dados presentes dentro de seus formulários.

Sumário

Clique aqui para fazer o download de um arquivo .zip que contém o projeto que implementa o código de exemplo da ASP.NET MVC 2 que eu demonstrei no passo a passo acima.

A construção de hoje da ASP.NET MVC 2 é somente uma primeira preview. Mais recursos chegarão em versões futuras, e o time espera receber bastante retorno com relação ao que pode ser feito para melhorar e aumentar a quantidade de recursos disponíveis na distribuição.

O objetivo de disponibilizarmos estas previews regulares é ajudar a termos certeza que este processo de retorno está aberto e que qualquer um que queira participar possa facilmente se envolver. Por favor nos envie qualquer retorno, sugestões ou relate problemas que você tem no
Fórum da ASP.NET MVC em www.asp.net.  Você pode também aprender mais sobre este lançamento a partir do post MVC2 de Phil Haack, e a partir do Vídeo que Phil fez com Scott Hanselman sobre o lançamento da Preview 1 no Channel9.

Espero que ajude,

Scott

P.S. Eu tenho usado o Twitter mais recentemente para disponibilizar posts rápidos e compartilhar links. Você pode me seguir no Twitter em http://www.twitter.com/scottgu (@scottgu é o meu nome no Twitter).

 

Texto traduzido do post original por Leniel Macaferi.

Published Friday, July 31, 2009 2:53 AM by Leniel Macaferi

Comments

# re: Preview 1 da ASP.NET MVC V2 Lançada

Tuesday, August 11, 2009 12:43 PM by Leonardo

Estamos muito empolgados com essa nova versão ! já existe uma previsão de data para o lançamento da versão final ?

# re: Preview 1 da ASP.NET MVC V2 Lançada

Saturday, August 15, 2009 11:15 AM by Leniel Macaferi

Leonardo,

Nesta página www.codeplex.com/.../View.aspx você pode encontrar o roadmap para o lançamento da ASP.NET MVC.

Veja que a ASP.NET MVC V2 RTM (disponível para o público em geral) será inclusa no Visual Studio 2010 RTM.

Leniel Macaferi