ASP.NET Core -  Como funciona o Model Binding


Hoje vamos apresentar os conceitos do Model Binding na ASP .NET Core.

O model binding da ASP.NET Core mapeia dados de requisições HTTP para parâmetros dos métodos Action dos controladores.

Os parâmetros podem ser tipos simples, como cadeias de caracteres, inteiros ou floats, ou podem ser tipos complexos como objetos e tipos personalizados. Esse é um ótimo recurso do MVC, pois o mapeamento dos dados de entrada para um equivalente é um cenário repetido com frequência, independentemente do tamanho ou da complexidade dos dados.

O MVC resolve esse problema com a abstração da associação, de modo que os desenvolvedores não precisam continuar reconfigurando uma versão ligeiramente diferente desse mesmo código em cada aplicativo. Escrever o seu próprio código para tipar o código de conversor é entediante e propensa a erros.

Como funciona ?

O Model Binding é o processo pelo qual o ASP.NET Core MVC recebe uma solicitação HTTP e "liga" partes dessa solicitação, bem como outras fontes de dados, a entradas (por exemplo, parâmetros) em uma Action do controlador.  Por exemplo, vamos ver um URL simples:

http://www.meusite.com/blog/posts/5

Sabemos que esse URL está tentando recuperar a postagem do blog com o ID 5 da seção /blog do meusite.com. Mas o ASP.NET não tem como saber quais são as nossas intenções e, portanto, usa a vinculação de modelo para analisar a URL. Por padrão, o ASP.NET Core MVC usa a seguinte rota para mapear URLs de entrada:

{controller}/{action}/{id?}

E assim, a URL acima seria mapeado para a Action Posts do controlador BlogController, passando um parâmetro com o nome id e o valor 5.

Data Sources ou Fonte de dados

O MVC tentará associar os dados de requisição aos parâmetros de Action por nome e vai procurar valores para cada parâmetro usando o nome do parâmetro e os nomes de suas propriedades configuráveis públicas.

No exemplo acima, o único parâmetro de ação é chamado id, que o MVC associa ao valor com o mesmo nome nos valores de rota. Além dos valores de rota, o MVC associará dados de várias partes da solicitação e faz isso em uma ordem específica. Veja abaixo uma lista das fontes de dados na ordem em que o model binding as examina:

  1. Form values: Esses são valores de formulário que entram na solicitação HTTP usando o método POST. (incluindo as solicitações POST jQuery).
  2. Route values: O conjunto de valores de rota fornecido pelo roteamento.
  3. Query strings: A parte da cadeia de caracteres de consulta do URI.

Sendo que os valores de formulário, dados de rota e cadeias de consulta são todos armazenados como pares nome-valor.

Vinculação de tipos Complexos

Para fazer a vinculação de tipos complexos como classe de domínio a ASP .NET Core usa Reflection e Recursão para percorrer as propriedades dos tipos procurando por correspondências.

Ele procura o padrão nome_do_parâmero.nome_da_propriedade para associar valores às propridades.

Considere a seguinte classe de domínio em uma aplicação ASP .NET Core:

public class Usuario
{

    public string Nome {get; set; }
}

 

Agora considere a seguinte URL correspondente:

https://www.meusite.com/usuarios/create?nome=Macoratti

O model binding vai usar Reflection para descobrir que a classe Usuario tem uma propridedade Nome e vai vincular a ela o valor do parâmetro nome que é 'Macoratti' encontrado na string de consulta.

Assim, o model binding atua de forma flexível e poderosa para atender à maioria das necessidades.

Dessa forma o comportamento padrão do Model Binding ocorre quando nenhum atributo estiver sendo usado e é o seguinte:

Agora, se você quiser mudar, ou estender, esse comportamento, pode usar os atributos do Model Binding.

Customizando o Model Binding com atributos

Podemos usar Atributos nos métodos Action para sobrescrever o comportamento padrão do Model Binding.

Além da metodologia de vinculação padrão, o ASP.NET Core oferece uma maneira mais personalizada de realizar o model binding usando atributos que vão sobrescrever o comportamento padrão.

A seguir temos alguns dos atributos oferecidos pelo ASP.NET Core :

Comportamento do Model Binding com alguns atributos

Vejamos agora como o Model Binding atua quando usamos alguns dos atributos elencados acima.

1 - Atributo [FromHeader] - Binding Header

A vinculação aos cabeçalhos HTTP (Http headers) merece os seguintes destaques:

Para tipos complexos, o atributo [FromHeader] é aplicado às propriedades do tipo.

Se o cabeçalho HTTP contiver caracteres ilegais para nomes de variáveis, eles podem ser fornecidos através da propriedade Name dos atributos.

public class Demo
{
      [FromHeader]
      public string Host { get; set; }
     
       [FromHeader(Name="User-Agent)]
       public string UserAgend { get; set; } 
}

2 - Atributo [FromBody] - Binding Body

O corpo da resposta HTTP pode ser lido em um tipo complexo.

Por padrão, a classe JsonInputFormatter é usada para manipular a vinculação do corpo da solicitação. Os formatadores de entrada são usados ​​com base na propriedade Content-Type do cabeçalho de requisição HTTP. Abaixo está uma requisição de exemplo com o corpo JSON.

{
   "nome" : "macoratti"
   "email" : "macoratti@yahoo.com
}

Se você quiser trocar de JSON para XML o valor da entrada, precisa modificar o formatador o método ConfigureServices:

  1. public void ConfigureServices(IServiceCollection services)  
  2. {  
  3.     services.AddMvc()  
  4.             .AddXmlSerializerFormatters();  
  5. }  

Após esse ajuste você pode enviar dados no corpo da requisição no formato XML.

Veja como customizar globamente o comportamento do model binding neste artigo: Personalizar o Model Binding

E por hoje era isso...

(disse Jesus) - "Porque por tuas palavras serás justificado, e por tuas palavras serás condenado."
Mateus 12:37

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

Referências:


José Carlos Macoratti