Descomplicando o Model Binding no ASP.NET Core
Sumário
- Introdução
- [Bind] - Obtendo propriedades específicas
- [FromQuery] - Obtendo valores da cadeia de caracteres de consulta
- [FromRoute] - Obtendo valores de dados de rota
- [FromForm] - Obtendo valores de campos de formularios postado
- [FromBody] - Obtendo valores do corpo da solicitação
- Continue lendo
- 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].
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();