Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este documento descreve novos recursos e melhorias introduzidos no ASP.NET MVC 2.
Introdução
Atualizando um projeto do ASP.NET MVC 1.0 para ASP.NET MVC 2
Novos recursos
Auxiliares de modelo
Áreas
Suporte para controladores assíncronos
Suporte para DefaultValueAttribute em parâmetros Action-Method
Suporte para associar dados binários com associadores de modelo
Classes ModelMetadata e ModelMetadataProvider
Suporte para atributos DataAnnotations
Provedores validadores de modelo
Validação do lado do cliente
Novos snippets de código para Visual Studio 2010
Novo filtro de ação RequireHttpsAttribute
Substituindo o verbo do método HTTP
Nova classe HiddenInputAttribute para auxiliares de modelo
O método Auxiliar Html.ValidationSummary pode exibir erros de Model-Level
Modelos T4 no Visual Studio geram código específico para a versão de destino das melhorias de .NET FrameworkAPI
Alterações interruptivas
Aviso de isenção de responsabilidade
Introdução
ASP.NET MVC 2 se baseia no ASP.NET MVC 1.0 e apresenta um grande conjunto de aprimoramentos e recursos focados no aumento da produtividade. Esta versão é compatível com ASP.NET MVC 1.0, portanto, todos os seus conhecimentos, habilidades, código e extensões para ASP.NET MVC 1.0 continuam se aplicando.
Para obter mais informações sobre ASP.NET MVC, visite os seguintes recursos:
Atualizando um projeto do ASP.NET MVC 1.0 para ASP.NET MVC 2
ASP.NET MVC 2 pode ser instalado lado a lado com ASP.NET MVC 1.0 no mesmo servidor, o que dá aos desenvolvedores de aplicativos flexibilidade para escolher quando atualizar um aplicativo ASP.NET MVC 1.0 para ASP.NET MVC 2. Para obter informações sobre como atualizar, consulte o documento Atualizando um aplicativo ASP.NET MVC 1.0 para ASP.NET MVC 2.
Novos recursos
Esta seção descreve os recursos que foram introduzidos na versão MVC 2.
Auxiliares de modelo
Os auxiliares de modelo permitem associar automaticamente elementos HTML para edição e exibição com tipos de dados. Por exemplo, quando dados do tipo System.DateTime são exibidos em um modo de exibição, um elemento de interface do usuário do seletor de data pode ser renderizado automaticamente. Isso é semelhante a como os modelos de campo funcionam no ASP.NET Dados Dinâmicos. Para obter mais informações, consulte Usando auxiliares de modelo para exibir dados no site do MSDN.
Áreas
As áreas permitem organizar um projeto grande em várias seções menores para gerenciar a complexidade de um aplicativo Web grande. Cada seção ("área") normalmente representa uma seção separada de um site grande e é usada para agrupar conjuntos de controladores e exibições relacionados. Para obter mais informações, consulte Passo a passo: organizando um aplicativo MVC ASP.NET por áreas no site do MSDN.
Para criar uma nova área, em Gerenciador de Soluções, clique com o botão direito do mouse no projeto, clique em Adicionar e, em seguida, clique em Área. Isso exibe uma caixa de diálogo que solicita o nome da área. Depois de inserir o nome da área, o Visual Studio adiciona uma nova área ao projeto.
A figura a seguir mostra um layout de exemplo para um projeto com duas áreas, Administração e Blogs.
Quando você cria uma área, o Visual Studio adiciona uma classe que deriva de AreaRegistration a cada área. Essa classe é necessária para registrar a área e suas rotas, conforme mostrado no exemplo a seguir:
namespace MyApplication.Areas.Blog {
public class BlogAreaRegistration : AreaRegistration {
public override string AreaName {
get { return "blog"; }
}
public override void RegisterArea(AreaRegistrationContext context) {
context.MapRoute(
"blog_default",
"blog/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
context.MapRoute(
"blog_whatsnew",
"whats-new",
new { action = "WhatsNew", id = UrlParameter.Optional }
);
}
}
}
O modelo de projeto padrão para ASP.NET MVC 2 inclui uma chamada para o método RegisterAllAreas no código do arquivo Global.asax. Esse método registra cada área no projeto procurando todos os tipos que derivam da classe AreaRegistration, instanciando uma instância do tipo e, em seguida, chamando o método RegisterArea na instância. O exemplo a seguir mostra como isso é feito.
public class MyMvcApplication : HttpApplication {
void App_Start() {
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes) {
routes.MapRoute("default", "{controller}/{action}/{id}", ...);
}
}
Se você não especificar o namespace no método RegisterArea chamando o contexto. Método Namespaces.Add, o namespace da classe de registro é usado por padrão.
Suporte para controladores assíncronos
ASP.NET MVC 2 agora permite que os controladores processem solicitações de forma assíncrona. Isso pode levar a ganhos de desempenho, permitindo que servidores que frequentemente chamam operações de bloqueio (como solicitações de rede) chamem equivalentes sem bloqueio. Para obter mais informações, consulte o tópico Usando um controlador assíncrono no ASP.NET MVC no MSDN.
Suporte para DefaultValueAttribute em parâmetros Action-Method
A classe System.ComponentModel.DefaultValueAttribute permite que um valor padrão seja fornecido para o parâmetro de argumento para um método de ação. Por exemplo, suponha que a seguinte rota padrão seja definida:
{controller}/{action}/{id}
Suponha também que o seguinte método de controlador e ação esteja definido:
public class ArticleController {
public ActionResult View(int id, [DefaultValue(1)]int page) {
}
}
Qualquer uma das URLs de solicitação a seguir invocará o método de ação View definido no exemplo anterior.
- /Article/View/123
- /Article/View/123?page=1 (efetivamente o mesmo que a solicitação anterior)
- /Article/View/123?page=2
Sem o atributo DefaultValueAttribute, a primeira URL da lista anterior não funcionaria, pois o argumento page é um tipo de valor não anulável cujo valor não foi fornecido.
Se o código for escrito no Visual Basic 2010 ou no Visual C# 2010, você poderá usar parâmetros opcionais em vez do atributo DefaultValueAttribute, conforme mostrado no exemplo a seguir:
Function View(ByVal id As Integer, Optional ByVal page As Integer = 1) _
As ActionResult
' ...
End Function
public ActionResult MyAction(int id, int page = 1) {
// ...
}
Suporte para associar dados binários com associadores de modelo
Há duas novas sobrecargas do auxiliar Html.Hidden que codificam valores binários como cadeias de caracteres codificadas em base 64:
public static string Hidden(this HtmlHelper htmlHelper, string name, Binary value);
public static string Hidden(this HtmlHelper htmlHelper, string name, byte[] value);
Um uso típico é inserir um carimbo de data/hora para um objeto na exibição. Por exemplo, seu aplicativo pode incluir o seguinte objeto Product:
public class Product {
//... other properties ...
public byte[] TimeStamp {
get;
set;
}
}
Um formulário de edição pode renderizar a propriedade TimeStamp no formulário, conforme mostrado no exemplo a seguir:
<%@ Page Inherits="ViewPage<Product>" %>
<%= Html.Hidden("TimeStamp", Model.TimeStamp) %>
Essa marcação renderiza um elemento de entrada oculto com o valor de carimbo de data/hora como uma cadeia de caracteres codificada em base 64 que se assemelha ao exemplo a seguir:
<input type="hidden" name="TimeStamp" value="QVNQLk5FVCBNVkMgaXMgZnVuIQ==" />
Esse formulário pode ser postado em um método de ação que tem um argumento do tipo Product, conforme mostrado no exemplo a seguir:
public ActionResult Edit(Product p) {
// p.TimeStamp is populated from the form
}
No método de ação, a propriedade TimeStamp é preenchida corretamente porque a cadeia de caracteres codificada em base 64 postada é convertida em uma matriz de bytes.
Classes ModelMetadata e ModelMetadataProvider
A classe ModelMetadataProvider fornece uma abstração para obter metadados para o modelo em uma exibição. O MVC 2 inclui um provedor padrão que disponibiliza os metadados expostos pelos atributos no namespace System.ComponentModel.DataAnnotations. É possível criar provedores de metadados que fornecem metadados de outros armazenamentos de dados, como bancos de dados ou arquivos XML.
A classe ViewDataDictionary expõe um objeto ModelMetadata que contém os metadados extraídos do modelo pela classe ModelMetadataProvider. Isso permite que os auxiliares com modelo consumam esses metadados e ajustem sua saída adequadamente.
Para obter mais informações, consulte a documentação das classes ModelMetadata e ModelMetadataProvider .
Suporte para atributos DataAnnotations
ASP.NET MVC 2 dá suporte ao uso dos atributos de validação RangeAttribute, RequiredAttribute, StringLengthAttribute e RegexAttribute (definidos no namespace System.ComponentModel.DataAnnotations) quando você associa a um modelo para fornecer validação de entrada.
Para obter mais informações, consulte Como validar dados de modelo usando atributos DataAnnotations no site do MSDN. Um projeto de exemplo que ilustra o uso desses atributos está disponível para download em https://go.microsoft.com/fwlink/?LinkId=157753.
Provedores de Model-Validator
A classe de provedor de validação de modelo representa uma abstração que fornece lógica de validação para o modelo. ASP.NET MVC inclui um provedor padrão com base em atributos de validação incluídos no namespace System.ComponentModel.DataAnnotations. Você também pode criar seus próprios provedores de validação que definem regras de validação personalizadas e mapeamentos personalizados de regras de validação para o modelo. Para obter mais informações, consulte a documentação da classe ModelValidatorProvider .
Validação de Client-Side
A classe de provedor de validador de modelo expõe metadados de validação para o navegador na forma de dados serializados por JSON que podem ser consumidos por uma biblioteca de validação do lado do cliente. ASP.NET MVC 2 inclui uma biblioteca de validação de cliente e um adaptador que dá suporte aos atributos de validação de namespace DataAnnotations observados anteriormente. A classe de provedor também permite que você use outras bibliotecas de validação de cliente escrevendo um adaptador que processa os dados JSON e chama a biblioteca alternativa.
Novos snippets de código para Visual Studio 2010
Um conjunto de snippets de código HTML para ASP.NET MVC 2 é instalado com o Visual Studio 2010. Para exibir uma lista desses snippets, no menu Ferramentas, selecione Gerenciador de Snippets de Código. Para o idioma, selecione HTML e, para local, selecione ASP.NET MVC 2. Para obter mais informações sobre como usar snippets de código, consulte a documentação do Visual Studio.
Novo filtro de ação RequireHttpsAttribute
ASP.NET MVC 2 inclui uma nova classe RequireHttpsAttribute que pode ser aplicada a métodos de ação e controladores. Por padrão, o filtro redireciona uma solicitação não SSL (HTTP) para o equivalente habilitado para SSL (HTTPS).
Substituindo o verbo do método HTTP
Quando você cria um site usando o estilo de arquitetura REST, os verbos HTTP são usados para determinar qual ação executar para um recurso. REST exige que os aplicativos ofereçam suporte a toda a gama de verbos HTTP comuns, incluindo GET, PUT, POST e DELETE.
ASP.NET MVC 2 inclui novos atributos que você pode aplicar a métodos de ação e essa sintaxe compacta de recursos. Esses atributos permitem que ASP.NET MVC selecione um método de ação com base no verbo HTTP. No exemplo a seguir, uma solicitação POST chamará o primeiro método de ação e uma solicitação PUT chamará o segundo método de ação.
[HttpPost]
public ActionResult Edit(int id)
[HttpPut]
public ActionResult Edit(int id, Tag tag)
Em versões anteriores do ASP.NET MVC, esses métodos de ação exigiam uma sintaxe mais detalhada, conforme mostrado no exemplo a seguir:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id)
[AcceptVerbs(HttpVerbs.Put)]
public ActionResult Edit(int id, Tag tag)
Como os navegadores dão suporte apenas aos verbos HTTP GET e POST, não é possível postar em uma ação que exija um verbo diferente. Portanto, não é possível dar suporte nativo a todas as solicitações RESTful.
No entanto, para dar suporte a solicitações RESTful durante operações POST, ASP.NET MVC 2 apresenta um novo método auxiliar HTML HttpMethodOverride. Esse método renderiza um elemento de entrada oculto que faz com que o formulário emule efetivamente qualquer método HTTP. Por exemplo, usando o método auxiliar HTML HttpMethodOverride, você pode fazer com que um envio de formulário pareça ser uma solicitação PUT ou DELETE. O comportamento de HttpMethodOverride afeta os seguintes atributos:
- HttpPostAttribute
- HttpPutAttribute
- HttpGetAttribute
- HttpDeleteAttribute
- Acceptverbsattribute
O elemento de entrada oculto tem seu nome X-HTTP-Method-Override e seu valor definido como o verbo HTTP a ser emulado. O valor de substituição também pode ser especificado em um cabeçalho HTTP ou em um valor de cadeia de caracteres de consulta como um par nome/valor.
A substituição só pode ser usada quando a solicitação real é uma solicitação POST. O valor de substituição será ignorado para solicitações que usam qualquer outro verbo HTTP.
Nova classe HiddenInputAttribute para auxiliares modelos
Você pode aplicar o novo atributo HiddenInputAttribute a uma propriedade de modelo para indicar se um elemento de entrada oculto deve ser renderizado ao exibir o modelo em um modelo de editor. (O atributo define um valor UIHint implícito de HiddenInput). A propriedade DisplayValue do atributo permite especificar se o valor é exibido nos modos de editor e exibição. Quando DisplayValue é definido como false, nada é exibido, nem mesmo a marcação HTML que normalmente envolve um campo. O valor padrão de DisplayValue é true.
Você pode usar o atributo HiddenInputAttribute nos seguintes cenários:
- Quando um modo de exibição permite que os usuários editem a ID de um objeto e é necessário exibir o valor, bem como fornecer um elemento de entrada oculto que contenha a ID antiga para que ele possa ser passado de volta para o controlador.
- Quando uma exibição permite que os usuários editem uma propriedade binária que nunca deve ser exibida, como uma propriedade timestamp. Nesse caso, o valor e a marcação HTML ao redor (como o rótulo e o valor) não são exibidos.
O exemplo a seguir mostra como usar a classe HiddenInputAttribute.
public class ProductViewModel {
[HiddenInput] // equivalent to [HiddenInput(DisplayValue=true)]
public int Id { get; set; }
public string Name { get; set; }
[HiddenInput(DisplayValue=false)]
public byte[] TimeStamp { get; set; }
}
Quando o atributo é definido como true (ou nenhum parâmetro é especificado), o seguinte ocorre:
- Em modelos de exibição, um rótulo é renderizado e o valor é exibido para o usuário.
- Em modelos de editor, um rótulo é renderizado e o valor é renderizado em um elemento de entrada oculto.
Quando o atributo é definido como false, ocorre o seguinte:
- Em modelos de exibição, nada é renderizado para esse campo.
- Em modelos de editor, nenhum rótulo é renderizado e o valor é renderizado em um elemento de entrada oculto.
Método Auxiliar Html.ValidationSummary pode exibir erros de Model-Level
Em vez de sempre exibir todos os erros de validação, o método auxiliar Html.ValidationSummary tem uma nova opção para exibir apenas erros no nível do modelo. Isso permite que erros no nível do modelo sejam exibidos no resumo de validação e os erros específicos do campo sejam exibidos ao lado de cada campo.
Modelos T4 no Visual Studio geram código específico para a versão de destino do .NET Framework
Uma nova propriedade está disponível para arquivos T4 do host ASP.NET MVC T4 que especifica a versão do .NET Framework usada pelo aplicativo. Isso permite que modelos T4 gerem código e marcação específicos para uma versão do .NET Framework. No Visual Studio 2008, o valor é sempre .NET 3.5. No Visual Studio 2010, o valor é .NET 3.5 ou .NET 4.
Aprimoramentos de API
Esta seção descreve as alterações em membros e tipos MVC ASP.NET existentes.
- Adicionado um método CreateActionInvoker virtual protegido na classe Controller. Esse método é invocado pela propriedade ActionInvoker de Controller e permite a instanciação lenta do invocador se nenhum invocador já estiver definido.
- Adicionado um método HandleUnauthorizedRequest virtual protegido na classe AuthorizeAttribute. Isso permite que os filtros derivados de AuthorizeAttribute controlem o comportamento quando a autorização falha.
- Adicionado um método Add(string key, object value) na classe ValueProviderDictionary. Isso permite que você use a sintaxe do inicializador de dicionário para ValueProviderDictionary, como no exemplo a seguir:
Controller c = new MyController();
c.ValueProvider = new ValueProviderDictionary(null) {
{ "example1", "example1Value" },
{ "example2", "example2Value" },
{ "example3", new int[] { 1, 2, 3 } }
};
- Adicionado um método get_object na classe Sys.Mvc.AjaxContext. Esse é um método JavaScript semelhante ao método get_data, mas se o tipo de conteúdo da resposta for application/json, get_object retornará o objeto JSON.
- Adicionada uma propriedade ActionDescriptor na classe AuthorizationContext.
- Adicionado um token UrlParameter.Optional que pode ser usado para contornar problemas ao associar a um modelo que contém uma propriedade de ID quando a propriedade está ausente em uma postagem de formulário. Para obter mais detalhes, consulte a entrada ASP.NET parâmetros de URL opcionais do MVC 2 no blog de Phil Haack.
Alterações de quebra
As alterações a seguir podem causar erros em aplicativos MVC 1.0 ASP.NET existentes.
Alteração no comportamento de validação de propriedade para classes que implementam IDataErrorInfo
Para objetos de modelo que usam IDataErrorInfo para executar a validação, cada propriedade é validada, independentemente de um novo valor ter sido definido. No ASP.NET MVC 1.0, somente as propriedades que tinham novos valores definidos foram validadas. No ASP.NET MVC 2, a propriedade Error de IDataErrorInfo será chamada somente se todos os validadores de propriedade tiverem sido bem-sucedidos.
O script de mapeamento de script do IIS não está mais disponível no instalador
O script de mapeamento de script do IIS é um script de linha de comando usado para configurar mapas de script para o IIS 6 e para o IIS 7 no modo Clássico. O script de mapeamento de script não será necessário se você usar o Servidor de Desenvolvimento do Visual Studio ou se usar o IIS 7 no modo Integrado. Os scripts estão disponíveis como um download separado sem suporte no WebStack ASP.NET.
O método auxiliar Html.Substitute no MVC Futures não está mais disponível
Devido a alterações no comportamento de renderização dos mecanismos de exibição do MVC, o método auxiliar Html.Substitute não funciona e foi removido.
A interface IValueProvider substitui todos os usos de IDictionary
Cada argumento de propriedade ou método que aceitou IDictionary no MVC 1.0 agora aceita IValueProvider. Essa alteração afeta apenas aplicativos que incluem provedores de valor personalizado ou associadores de modelo personalizado. Exemplos de propriedades e métodos afetados por essa alteração incluem o seguinte:
- A propriedade ValueProvider das classes ControllerBase e ModelBindingContext.
- Os métodos TryUpdateModel da classe Controller.
Novas classes CSS foram adicionadas no arquivo Site.css
O arquivo Site.css nos modelos de projeto do ASP.NET MVC foi atualizado para incluir novos estilos usados pela funcionalidade de validação e pelos auxiliares modelos.
Os auxiliares agora retornam um objeto MvcHtmlString
Para aproveitar a nova sintaxe de expressão de codificação HTML no ASP.NET 4, o tipo de retorno para auxiliares HTML agora é MvcHtmlString em vez de uma cadeia de caracteres. Se você usar ASP.NET MVC 2 e os novos auxiliares no ASP.NET 3.5, não poderá aproveitar a sintaxe de codificação HTML; a nova sintaxe só estará disponível quando você executar ASP.NET MVC 2 no ASP.NET 4.
JsonResult agora responde apenas a solicitações HTTP POST
Para atenuar os ataques de sequestro de JSON que têm o potencial de divulgação de informações, por padrão, a classe JsonResult agora responde apenas às solicitações HTTP POST. As chamadas GET do Ajax para métodos de ação que retornam um objeto JsonResult devem ser alteradas para usar POST. Se necessário, você pode substituir esse comportamento definindo a nova propriedade JsonRequestBehavior de JsonResult. Para obter mais informações sobre a potencial exploração, consulte a postagem no blog JSON Hijacking no blog de Phil Haack.
Os setters de propriedade Model e ModelType em ModelBindingContext são obsoletos
Uma nova propriedade ModelMetadata settable foi adicionada à classe ModelBindingContext. A nova propriedade encapsula as propriedades Model e ModelType. Embora as propriedades Model e ModelType estejam obsoletas, para compatibilidade com versões anteriores, os getters de propriedade ainda funcionam; eles delegam à propriedade ModelMetadata para recuperar o valor.
Alterações na classe DefaultControllerFactory interrompem fábricas de controladores personalizados que derivam dela
A classe DefaultControllerFactory foi corrigida removendo a propriedade RequestContext. No lugar dessa propriedade, a instância de contexto de solicitação é passada para os métodos GetControllerInstance e GetControllerType virtuais protegidos. Essa alteração afeta fábricas de controladores personalizados derivadas de DefaultControllerFactory.
As fábricas de controladores personalizados geralmente são usadas para fornecer injeção de dependência para ASP.NET aplicativos MVC. Para atualizar as fábricas de controladores personalizados para dar suporte a ASP.NET MVC 2, altere a assinatura ou as assinaturas do método para corresponder às novas assinaturas e use o parâmetro de contexto de solicitação em vez da propriedade .
"Área" agora é uma chave de valor de rota reservada
A cadeia de caracteres "area" em Valores de rota agora tem um significado especial em ASP.NET MVC, da mesma forma que "controlador" e "ação" fazem. Uma implicação é que, se os auxiliares HTML forem fornecidos com um dicionário de valor de rota contendo "área", os auxiliares não acrescentarão mais "área" na cadeia de caracteres de consulta.
Se você estiver usando o recurso Áreas, não use {area} como parte da URL de rota.
Isenção de responsabilidade
Este é um documento preliminar e pode ser alterado substancialmente antes da versão comercial final do software descrito aqui.
As informações contidas neste documento representam a visão atual da Microsoft Corporation acerca das questões discutidas até a data da publicação. Como a Microsoft deve reagir às dinâmicas condições do mercado, essas informações não devem ser interpretadas como um compromisso por parte da Microsoft e a Microsoft não garante a precisão de qualquer informação apresentada após a data de publicação.
Este whitepaper é apenas para fins informativos. A MICROSOFT NÃO OFERECE GARANTIA, EXPRESSA, IMPLÍCITA OU ESTATUTÁRIA, DAS INFORMAÇÕES CONTIDAS NESTE DOCUMENTO.
Obedecer a todas as leis de direitos autorais aplicáveis é responsabilidade do usuário. Sem limitar os direitos autorais, nenhuma parte deste documento pode ser reproduzida, armazenada ou introduzida em um sistema de recuperação, ou transmitida de qualquer forma ou por qualquer meio (seja eletrônico, mecânico, fotocópia, gravação ou outro), ou para qualquer finalidade, sem a permissão expressa e por escrito da Microsoft Corporation.
A Microsoft pode ter patentes ou requisições para obtenção de patente, marcas comerciais, direitos autorais ou outros direitos de propriedade intelectual que abrangem o conteúdo deste documento. A posse deste documento não lhe confere nenhum direito sobre patentes, marcas comerciais, direitos autorais ou outros direitos de propriedade intelectual, salvo aqueles expressamente mencionados em um contrato de licença, por escrito, da Microsoft.
A menos que indicado de outra forma, as empresas de exemplo, organizações, produtos, nomes de domínio, endereços de email, logotipos, pessoas, locais e eventos descritos aqui são fictícios e nenhuma associação com nenhuma empresa real, organização, produto, nome de domínio, endereço de email, logotipo, pessoa, local ou evento é pretendida ou deve ser inferida.
© Microsoft Corporation 2010. Todos os direitos reservados.
Microsoft e Windows são marcas registradas ou comerciais da Microsoft Corporation nos Estados Unidos e/ou em outros países.
Os nomes de empresas reais e produtos mencionados aqui podem ser marcas comerciais de seus respectivos proprietários.