Hoje
cedo, a equipe da ASP.NET lançou a versão Release Candidate RC2
(Candidata a Lançamento) da ASP.NET MVC 3. Você pode fazer o download e
instalá-la aqui.
Quase lá...
A
versão RC2 de hoje é a versão quase final da ASP.NET MVC 3, e é uma
"candidata a lançamento" genuína na medida em que nós não pretendemos
fazer mais alterações no código. Estamos publicando a mesma hoje para
que as pessoas possam fazer testes finais com ela, nos informando se
encontrarem algum problema de última hora "showstoppers", e para que
possam começar a atualizar suas aplicações para fazer uso desta última
versão. Vamos lançar oficialmente a versão final da ASP.NET MVC 3
"RTM", em Janeiro.
Funciona com o VS 2010 e VS 2010 SP1 Beta
O
lançamento de hoje da ASP.NET MVC 3 RC2 funciona tanto com a versão de
lançamento do Visual Studio 2010 / Visual Web Developer 2010 Express
(que é gratuito), bem como o recém-lançado VS 2010 SP1 Beta (em Inglês).
Isso significa que você não
precisa instalar o VS 2010 SP1 (ou a versão beta do SP1) para usar a
ASP.NET MVC 3. Ela funciona muito bem com a versão de lançamento do
Visual Studio 2010. Vou escrever um post na próxima semana sobre
algumas das coisas boas adicionais que acompanham o VS 2010 SP1
(incluindo o suporte para o IIS Express e para o SQL CE dentro do VS),
que tornam a experiência de desenvolvimento para ASP.NET Web Forms e
ASP.NET MVC ainda melhor.
Consertos de Bugs e Performance
O
lançamento de hoje da ASP.NET MVC 3 RC2 contém muitas correções de bugs
e otimizações de desempenho. Nossos últimos testes de desempenho
indicam que a ASP.NET MVC 3 está mais rápida do que a ASP.NET MVC 2, e
que as atuais aplicações ASP.NET MVC experimentarão um pequeno aumento
de desempenho, quando atualizadas para rodar com a ASP.NET MVC 3.
Ajustes Finais
Além
de correções de bugs e otimizações de desempenho, a RC2 de hoje contém
um número de ajustes de última hora para recursos e alterações do tipo
"fit-and-finish" (encaixar-e-terminar) para os novos recursos da
ASP.NET MVC 3. Os comentários e sugestões que recebemos durante as
amostras públicas têm sido de inestimável valor para nos orientar nestes
ajustes finais, e nós realmente apreciamos o apoio das pessoas em nos
enviar este retorno.
A seguir está uma pequena lista de algumas
das alterações de recursos/ajustes feitos entre a ASP.NET MVC 3 RC do
mês passado e o lançamento da ASP.NET MVC 3 RC2 de hoje:
Atualizações para jQuery e adição da jQuery UI
Os modelos de projeto da ASP.NET MVC 3 foram atualizados para incluir a jQuery 1.4.4 e a jQuery Validation 1.7.
Nós
também estamos animados em anunciar hoje que estamos incluindo a jQuery
UI dentro de nossos modelos de projeto padrão da ASP.NET daqui por
diante. A jQuery UI fornece um poderoso conjunto de elementos (widgets) e
recursos adicionais para a interface do usuário (UI). Ela será
adicionada por padrão na pasta \scripts do seu projeto quando você criar
novos projetos ASP.NET MVC 3.
Criaçåo Automática de Visões (Scaffolding) Melhorada
Os
modelos (templates) T4 usados para criar visões de maneira automática
através da janela Add->View (Adicionar->Visão) agora gera
visões que usam Html.EditorFor ao invés de métodos de ajuda como Html.TextBoxFor.
Esta alteração permite que você opcionalmente anote os modelos com
metadados (usando atributos de anotação de dados) para customizar de uma
maneira melhor o código de saída de sua interface do usuário no tempo
de execução.
A janela de diálogo Add->View também suporta uma
detecção melhorada e uso de informações de chave primária em modelos
(incluindo suporte para as convenções de nomenclatura como ID,
ProductID, etc.). Por exemplo: a janela de diálogo Add View usa essas
informações para garantir que o valor da chave primária não seja criado
como um campo editável no formulário, e que os links entre as visões
sejam gerados corretamente e automaticamente com informações de chave
primária.
Os modelos padrão Edit (Editar) e Create (Criar) agora
também incluem referências para aos scrips da jQuery necessários para a
validação de dados no lado do cliente. Formulários de visão criados
automaticamente (scaffolded) agora suportam a validação de dados no lado
do cliente por padrão (sem etapas extras). Validação de dados no lado
do cliente com a ASP.NET MVC 3 também é feita utilizando uma abordagem
javascript discreta - tornando as páginas rápidas e limpas.
[ControllerSessionState] -> [SessionState]
A
ASP.NET MVC 3 adiciona suporte para controladores sem sessão
(session-less). Com a RC inicial você usava um atributo
[ControllerSessionState] para especificar isso. Nós encurtamos esse
atributo na RC2 para ser apenas [SessionState]:
Note
que, além de desligar o estado da sessão, você também pode configurá-lo
para ser somente de leitura - read-only (o que é útil para cenários de
webfarm onde você está lendo, mas não atualizando o estado da sessão em
uma determinada solicitação/request).
[SkipRequestValidation] -> [AllowHtml]
A
ASP.NET MVC inclui suporte nativo para proteger contra Ataques de
Injeção de HTML e Cross-Site Script e irá lançar um erro por padrão se
alguém tentar postar conteúdo HTML como entrada de dados. Os desenvolvedores
precisam indicar explicitamente que isto é permitido (e que eles tenham
esperançosamente construído suas aplicações para suportar isso de uma
forma segura) a fim de habilitar esse cenário.
Com a ASP.NET MVC
3, nós também estamos agora suportando um novo atributo que você pode
aplicar em propriedades dos modelos/modelos de visão para indicar que a
entrada HTML está habilitada, o que permite uma proteção muito mais
granular de uma forma DRY. Na versão RC do mês passado esse atributo
era chamado [SkipRequestValidation]. Com a RC2, renomeamos o mesmo para
[AllowHtml] para torná-lo mais intuitivo:
Definindo
o atributo acima [AllowHtml] em um modelo/model de visão, fará como que a
ASP.NET MVC 3 desligue a proteção contra injeção de HTML quando ela
fizer a vinculação de dados (binding) apenas daquela propriedade.
Método de ajuda Html.Raw()
O
novo motor de visão Razor introduzido com a ASP.NET MVC 3
automaticamente codifica o HTML de saída por padrão. Isso ajuda a
fornecer um nível adicional de proteção contra ataques de injeção de
HTML e de Script.
Com a RC2 estamos adicionando um novo método de
ajuda Html.Raw() que você pode usar para indicar explicitamente que
você não deseja codificar seu HTML de saída, e em vez disso quer
renderizar o conteúdo do jeito "como está":
ViewModel/View -> ViewBag
A
ASP.NET MVC tem suportado (desde a V1) um dicionário do tipo ViewData[]
dentro de Controladores e Visões que permite aos desenvolvedores passar
informações de um Controlador para uma Visão de uma maneira late-bound
(vinculação tardia). Essa abordagem pode ser usada em vez de, ou em
combinação com uma classe do modelo fortemente tipada. O código a
seguir demonstra um caso de uso comum - onde um modelo Product
fortemente tipado é passado para uma visão, além de duas variáveis
atribuídas tardiamente através do dicionário ViewData[]:
Com
a ASP.NET MVC 3 estamos introduzindo uma nova API que tira proveito do
suporte a um tipo dinâmico incluído no .NET 4 para definir/recuperar
esses valores. Ele permite que você use a notação "dot" padrão ( . )
para especificar qualquer número de variáveis adicionais a serem
passadas, e não requer que você crie uma classe fortemente tipada para
fazer isso.
Em amostras anteriores da ASP.NET MVC 3 nós
expusemos essa API usando uma propriedade dinâmica chamada "ViewModel"
na classe base do Controlador, e com uma propriedade dinâmica chamada
"View" dentro de modelos de visão. Muita gente achou confuso o fato de
haver dois nomes diferentes, e várias pessoas também disseram que usar o
nome ViewModel nesse contexto era confuso - já que muitas vezes você
cria classes ViewModel fortemente tipadas na ASP.NET MVC, e elas não
usam esta API.
Com a RC2 estamos expondo uma propriedade
dinâmica que tem o mesmo nome - ViewBag - dentro de Controladores e
Visões. É uma coleção dinâmica que lhe permite passar bits de dados
adicionais a partir de seu controlador para o seu modelo de visão a fim
de ajudar a gerar uma resposta. A seguir está um exemplo de como
podemos usá-la para passar uma mensagem de data e hora, bem como uma
lista de todas as categorias de produto para o nosso modelo de visão:
A
seguir está um exemplo de como o nosso modelo de visão (que é
fortemente tipado para esperar uma classe Product como seu modelo) pode
usar os dois bits de informação adicionais que passamos em nossa ViewBag
para gerar a resposta. Em particular, observe como estamos usando a
lista de categorias passada na coleção dinâmica ViewBag para gerar um
dropdownlist (combobox) de nomes de categoria amigáveis para ajudar a
definir a propriedade CategoryID de nosso objeto Product.
A combinação acima Controlador/Visão irá gerar então uma resposta HTML como a mostrada a seguir.
Melhorias para o Cacheamento de Saída
O
sistema de cache de saída da ASP.NET MVC 3 não mais requer que
você especifique uma propriedade VaryByParam ao declarar um atributo
[OutputCache] em um método de ação do Controlador. A MVC3 agora varia
automaticamente as entradas do cache de saída quando você tem parâmetros
explícitos no seu método de ação - permitindo que você habilite de modo
limpo o cache de saída em ações usando um código como o mostrado a
seguir:
Além
de suportar o cache de saída para a página inteira, a ASP.NET MVC 3
também suporta o cache de página parcial - o que te permite armazenar em
cache uma região de saída e reusá-la em várias solicitações (requests)
ou controladores. O comportamento de [OutputCache] para o cache de
página parcial foi atualizado com a RC2, de forma que entradas no cache
para sub-conteúdo sejam variadas com base em parâmetros de entrada,
oposto à estrutura da URL da solicitação top-level (de mais alto nível) -
o que torna os cenários de cache mais fáceis e mais poderosos do que o
comportamento da RC anterior.
A declaração @model não adiciona espaço em branco
Em prévias anteriores, a declaração @model
fortemente tipada no topo de uma visão do Razor adicionava uma linha em
branco na saída HTML gerada. Isso foi corrigido para que a declaração
não introduza espaços em branco.
Mudamos o Método "Html.ValidationMessage" para que este Exiba a Primeira Mensagem de Erro Útil
O comportamento do método de ajuda Html.ValidationMessage() foi atualizado para mostrar a primeira mensagem de erro útil ao invés de simplesmente mostrar o primeiro erro.
Durante a vinculação/ligação de dados no modelo, o dicionário ModelState
pode ser preenchido a partir de múltiplas fontes com mensagens de erro
sobre a propriedade, inclusive do próprio modelo (se ele implementar IValidatableObject),
a partir de atributos de validação aplicados na propriedade, e de
exceções lançadas enquanto a propriedade está sendo acessada.
Quando o método Html.ValidationMessage()
exibe uma mensagem de validação, ele agora pula entradas do estado do
modelo que incluem uma exceção, porque estas mensagens geralmente não
são destinadas ao usuário final. Ao invés disso, o método procura a
primeira mensagem de validação que não está associada a uma exceção e
exibe essa mensagem. Se nenhuma mensagem for encontrada, o padrão é uma
mensagem de erro genérica que está associada à primeira exceção.
RemoteAttribute "Fields" -> "AdditionalFields"
A
ASP.NET MVC 3 tem suporte nativo para validação remota com sua
infra-estrutura de validação. Isso significa que a biblioteca de script
de validação no lado do cliente utilizada pela ASP.NET MVC 3 pode
automaticamente fazer chamadas de volta (call-back) para os
controladores que você expor no servidor para determinar se um elemento
de entrada é realmente válido enquanto o usuário está editando o
formulário (o que te permite fornecer atualizações de validação em tempo
real).
Você pode fazer isso decorando uma propriedade do
modelo/modelo de visão com um atributo [Remote] que especifica o
controlador/ação que deve ser invocado/chamado para validá-la
remotamente. Com a RC esse atributo tinha uma propriedade chamada
"Fields" que podia ser usada para especificar elementos de entrada
adicionais que deveriam ser enviados do cliente para o servidor para
ajudar com a lógica de validação. Para melhorar a clareza do que essa
propriedade faz, nós renomeamos a mesma para "AdditionalFields" com o
lançamento da RC2.
Propriedades ViewResult.Model e ViewResult.ViewBag
A
classe ViewResult agora expõe uma propriedade "Model" e uma propriedade
"ViewBag" para fora dela. Isto torna mais fácil testar unitariamente
os Controladores que retornam Visões, e evita que você tenha que acessar o
modelo através da propriedade ViewResult.ViewData.Model.
Notas de Instalação
Você pode fazer o download e instalar a ASP.NET MVC 3 RC2 aqui. Ela pode ser instalada por cima da ASP.NET MVC 3 RC (ela deve apenas substituir os bits como parte de sua instalação).
Um
componente que não será atualizado pela instalação acima (se você já
tiver ele instalado) é o gerenciador de pacotes NuGet. Se você já tiver
o NuGet instalado, por favor acesse o Gerenciador de Extensões do
Visual Studio (por meio da opção do menu Tools->Extensions) e clique
na guia "Updates" (Atualizações). Você deverá ver o NuGet listado lá -
por favor clique no botão "Update" (Atualizar) próximo a ele para que o
VS atualize a extensão para o lançamento de hoje.
Se você não tem
o NuGet instalado (e não instalou a ASP.NET MVC 3 RC), então o NuGet será
instalado como parte da instalação da ASP.NET MVC 3, e você não precisa
tomar qualquer medida adicional para fazê-lo funcionar.
Resumo
Nós
estamos realmente perto do lançamento final da ASP.NET MVC 3, e iremos entregar a versão final "RTM" dela no próximo mês. Passaram-se pouco mais de sete meses desde que a ASP.NET MVC 2 foi
lançada, e estou muito impressionado com o grande número de novos
recursos, melhorias e aperfeiçoamentos que a equipe foi capaz de
adicionar nesta versão (Razor, JavaScript Não Intrusivo, NuGet, Injeção
de Dependência, Cache de Saída, e muito, muito mais). Estarei
escrevendo mais posts nas próximas semanas falando sobre muitos deles
com mais profundidade.
Espero que ajude,
Scott
PS Além do blog, eu também estou agora utilizando o Twitter para atualizações rápidas e para compartilhar links. Siga-me em: twitter.com/ScottGu
Texto traduzido do post original por
Leniel Macaferi.