Descomplicando o Model Binding no ASP.NET Core
08/04/2022
Brewerton Santos

Sumário

  1. Introdução
  2. [Bind] - Obtendo propriedades específicas
  3. [FromQuery] - Obtendo valores da cadeia de caracteres de consulta
  4. [FromRoute] - Obtendo valores de dados de rota
  5. [FromForm] - Obtendo valores de campos de formularios postado
  6. [FromBody] - Obtendo valores do corpo da solicitação
  7. Continue lendo
  8. Referências

Introdução

Este artigo tem o objetivo de introduzir às possíveis formas de manipular informações utilizando o ModelBinding.

[Bind] - Obtendo propriedades específicas

É possível que durante o processo de desenvolvimento surja situações onde seja necessário obter valores de propriedades especificas e ignorar outras. Para isto utilizamos o [Bind]. Assim ignorando propriedades não especificadas.

Código:

[HttpPost]
public IActionResult OnPost([Bind("Name, Email, IsActive")] User user)
    => throw new NotImplementedException();

No código acima pode-se ver o método OnPost que deve receber um usuário como paranêtro. Mas como temos interesse apenas em três campos específicos, declaramos eles com o Bind e assim receberemos os demais retornaram nulos ou caso tenham, um valor padrão.

Nota 1: Este comportamento relacionado aos atributos não especificados faz com que o [Bind] não seja uma boa opção em casos de edição já que ele não mantém o valor anterior das propriedades não especificadas.

[FromQuery] - Obtendo valores da cadeia de caracteres de consulta

Antes de obter os valores a partir de uma cadeia de caracteres de consulta vamos deixar claro o que ela é. A cadeia de caracteres de consulta ou QueryString é um modelo para atribuição de valores a parâmetros utilizando a URL (Uniform resource locator).

Exemplo: https://seudominio.com/controller/action/?Name=Joao&Email=mail@mail.com&IsActive=false&LastUpdateDate=null

O trecho ?Name=Joao%Email=mail@mail.com é a QueryString. Podemos identificá-la a partir do sinal de interrogação. Depois Temos os parâmetros no formato: Parâmetro=valor e separados pelo &.

Bem, então para recuperar os dados que estão sendo transportados na QueryString e converter em um objeto do tipo User é necessário utilizar o atributo [FromQuery]:

Código:

[HttpPost]
public IActionResult OnPost([FromQuery] User user)
    => throw new NotImplementedException();

Com o código acima o atributo [FromQuey] busca vincular os valores dos parâmetros da QueryString com propriedades equivalentes (mesmo nome e tipo compatível) no objeto User.

[FromRoute] - Obtendo valores de dados de rota

Aqui também recuperamos dados a partir da rota, mas disponíveis de forma diferente do [FromQuey] que foi mostrado anteriormente. Observe a URL abaixo

URL: https://seudominio.com/controller/action/mail@mail.com

Para recuperar o endereço de e-mail informado na URL podemos usar o [FromRoute]. Veja o exemplo abaixo:

[HttpPost("controller/action/{email}")]
public IActionResult Action([FromRoute] string email)
    => throw new NotImplementedException();

O [HttpPost] aqui recebe um modelo de rota que é complementado por um atributo que está sendo aguardado.

Nota 2: É possível melhorar a definição da rota. Um assunto que não será abordado neste artigo para manter o foco no na introdução ao ModelBinding.

[FromForm] - Obtendo valores de campos de formulários postados

Como o nome do parâmetro já sugere, ele é utilizado para recuperar valores de um formulário. Seguindo o memo padrão dos parâmetros anteriores, é necessário que os nomes coincidam. No código o uso dele fica assim:

[HttpPost]
public IActionResult ActionName([FromForm] User user)
    => throw new NotImplementedException();

Nota 3: Por ser característico (recuperar valores apenas de formulários postados) o [FromForm] aceita apenas métodos `[HttpPost].

# [FromBody] - Obtendo valores do corpo da solicitação Caso a solicitação tenha um formato como por exemplo `JSON` você pode utilizar o `[FromBody]` para recuperar informações da mesma. Exemplo de entrada JSON: ```json { "Name": "Joao Teste", "Email": "mail@mail.com" } ```

A declaração no código para leitura dos valores fica da seguinte forma:

[HttpPost]
public ActionResult<User> ActionName([FromBody] User user)
    => throw new NotImplementedException();

Continue lendo:

Logs no ASP.NET com Serilog

Criando uma API do zero com .NET Core 3.1 e EF Core

Conheça o autor

Brewerton Santos

Backend | Cloud | Community

Desenvolvedor de software e entusiasta de tecnologia da informação. Estruturando a carreira com base em tecnologias Microsoft e desenvolvimento open source.

An unhandled error has occurred. Reload 🗙