ASP .NET Core - Atributos do Model Binding


 Este artigo vou apresentar os principais atributos usados no Model Binding da ASP .NET Core.


O Model Binding  da Asp.Net Core tem um conjunto de atributos que nos dá a capacidade de controlar a partir de qual fonte queremos receber os dados da vinculação. Neste artigo vou apresentar os principais atributos e mostrar como e quando você pode usá-los.

Comportamento padrão do Model Binder

O comportamento padrão do model binder (vinculador do modelo) é que ele primeiro procura dados no formulário postado. Se ele não encontrou nenhum dado no formulário ele procura por dados no valor do roteamento e, finalmente, ele procura dados em cadeias de consulta.

Por exemplo, se tivermos uma URL assim :  Produtos/Detalhe/2?Id=4

O número 2 será vinculado, pois é a nossa variável de rota, mas podemos alterar essas prioridades, especificando exatamente de onde queremos que nossos dados sejam provenientes; Além disso, estes não são os únicos lugares dos quais podemos receber nossos dados.

A Asp.Net Core também nos dá a capacidade de receber dados de cabeçalhos HTTP.

Vejamos os atributos que podemos usar para direcionar o comportamento do model binding padrão.

Usando os atributos

1- FromForm

Este atributo faz com que o Model Binder utilize somente os dados recebidos do formulário enviado.

public IActionResult Detail([FromForm] ProdutoViewModel produtoViewModel) => View(produtoViewModel);

2- FromRoute

Este atributo faz com que o Model Binder apenas vincule dados que são oriundos da rota de dados

public IActionResult Detail([FromRoute] int id) => View();

3- FromQuery

Este atributo diz ao Model Binder para receber apenas os dados da cadeia de consulta (querystring).

public IActionResult Detail([FromQuery] int id) => View();

Se fizermos uma solicitação com a URL:  Produto/Detalhe/2?Id=4

O valor 4 será vinculado e não o valor 2 conforme seria previsto no comportamento padrão.

4- FromHeader

Este atributo diz ao Model Binder para vincular os valores que vêm no cabeçalho da requisição HTTP.

5- FromBody

Este atributo diz ao Model Binder para vincular dados a partir do Body do request.

public IActionResult Detail([FromBody] ProdutoViewModel produtoViewModel) => View(produtoViewModel);

6- FromServices

Este atributo vincula o valor especificado à implementação que foi configurada no seu container de injeção de dependência.

public IActionResult Detail([FromServices] IPrintable printer) => View();

7- Bind e BindNever

Este atributo vincula o valor especificado à implementação que foi configurada no seu container de injeção de dependência.

O atributo BindNever diz ao model binder que não deve vincular o atributo especificado.

Como você pode ver no trecho de código abaixo, IsAdminUser nunca será vinculado.

Esta abordagem pode ser chamada de propriedades de lista negra, o que não é uma boa prática de segurança.

É melhor listar os atributos que queremos vincular usando o atributo Bind, deixando de fora os que não queremos, como você pode ver no exemplo:
 
BindNever Bind
public class ProdutoViewModel
{
   [FromQuery]
   public int ProdutoId { get; set; }
   public string ProdutoName { get; set; }
   [BindNever]
   public string IsAdminUser { get; set; }
}

[Bind(nameof(ProdutoId), nameof(ProdutoNome))]
public class ProdutoViewModel
{
   [FromQuery]
   public int ProdutoId { get; set; }
   public string ProdutoNome { get; set; }
   public string IsAdminUser { get; set; }
}

Podemos usar todos esse atributos nas propriedades da nossa classe e não somente usá-los diretamente na lista de parâmetro da Action.

Até o próximo artigo...

"Se dissermos que temos comunhão com ele (Deus), e andarmos em trevas, mentimos, e não praticamos a verdade."
1 João 1:6

 

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/VS 2015 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti