ASPNET Core Validação Customizadas Server Side e Client Side

Toda aplicação WEB deve-se ter em mente que a parte de validação de dados é muito importante e é de fato o caminho que pode provocar inúmeros problemas se o mesmo não for feito de maneira correta e coerente.

Em ASPNET Core (também nas aplicação Full Framework) temos um maneira proposta que é com Data Annotations que foi introduzido desde da versão .NET 3.5. Data Annotations que pertence ao namespace System.ComponentModel.DataAnnotations são atributos que decoram e configuram as propriedades da sua classes sejam validadas as entradas dos dados e com isso tornam os dados informados válidos ou não, se válidos posteriormente sejam utilizados para outros fins, exemplo, persistir a informação em um banco de dados.

Segundo .NET, Microsoft Docs. System.ComponentModel.DataAnnotations. O namespace System.ComponentModel.DataAnnotations fornece classes de atributos usadas para definir metadados para controles de dados do ASP.NET e ASP.NET MVC. Disponível em: <https://docs.microsoft.com/pt-br/dotnet/api/system.componentmodel.dataannotations?view=netframework-4.7.2>. Acesso em: 21 de jan 2019.

Vale lembrar que nesse namespace segundo Alberto, Felipe. Validando models com DataAnnotations e Attributes no ASP.NET MVC. Disponível em: <http://devbrasil.net/m/blogpost?id=2307362%3ABlogPost%3A254317>, Acesso em: 21 jan 2019., temos três tipos de classificação:

  • ValidationAttributes: derivam da classe ValidationAttribute e são usados para garantir regras de validação que podem ser aplicadas a classes ou membros.
  • DisplayAttributes: usados para especificar como os dados de uma classe ou membro são exibidos.
  • Data Modeling Attributes: usados para especificar a estrutura e o relacionamento entre classes de dados (muito utilizados no Entity Framework Code First).

Entre alguns exemplos de atributos de validação mais conhecidos são:

Um exemplo básico nos mostro a validação sendo feita no servidor, exemplo básico:

Classe Car:

Modelo Car

Nessa classe Car temos duas validações na propriedade Title uma é a Required, ou seja, o dado é obrigatório e MaxLength significa que esse campo não pode ultrapassar 50 caracteres.

Construindo uma aplicação MVC para simular essas validações com ocontrole exemplo:

Controller Car

Nesse controller temos dois métodos create onde o decorado com HttpGet é o responsável em carregar a View e o decorado com HttpPost é responsável pelo seu paramento Car car receber as informações enviados pela requisição efetuado no formulário e existe um if que toma a decisão se o modelo é válido (ModelState.IsValid).

Observe o break point de um modelo inválido, ou seja, as regras impostos não foram compridas e com isso o modelo não passou na validação:

Modelo inválido

e agora o mesmo exemplo digitando no campo de titulo o status vai mudar, observe:

Modelo válido

ou seja, agora o modelo passou pelas regras de validação e se tornou válido e com isso pode tomar a decisão do que vai fazer com esse modelo válido.

Agora vem a pergunta, pode criar regras customizadas e especificas a um determinado modelo da aplicação?

R: sim, existe uma forma de construir códigos específicos para validação que não contenham no seu código base e a proposta é mostrar um cenário de validação customizada no Client e Server Side, ou seja, lado do cliente e no lado servidor.

Proposta

Regra: Quero controlar duas caixas de texto com valores numéricos onde valor inicial sempre tem que ser menor ou igual o valor final.

Modelo:

Nesse modelo proposto já existe uma regra que é de conhecimento anterior que é a Required (é obrigatório a digitação de dados), mas, além dela tem uma regra que não faz parte das validações sendo essa uma regra criada especificamente para validar os dados da regra proposta que em resumo é responsável em verificar se o campo ValueInitials sempre é menor ou igual o campo ValueEnds isso é feito pelo atributo MoreThan. Esse atributo é o código customizada com a regra que foi elabora e tem o seguinte código:

MoreThan Validação Customizada

observe que essa classe tem uma herança da classe ValidationAttribute que é disponibilizada para criação de modelos de validação customizadas no lado do servidor e IClientModelValidator que é responsável em criar as condições necessárias para validação ao lado do cliente.

Na validação do lado do servidor precisa ser escrito o código customizado no método IsValid(object value, ValidationContext validationContext) esse é o responsável em resgatar os valores do modelo enviado e conferir se realmente batem com a regra, mas, isso é conferida no momento da requisição Post desse modelo. Temos também que prever que o modelo enviado deve ir praticamente perfeito, digo isso porque podemos fazer uma conferencia dos dados antes do envio para o servidor, que é a validação ao lado do cliente com Javascript e isso é disponibilizado pelo método que foi implementado AddValidation(ClientModelValidationContext context).

Nesse método AddValidation precisamos ainda criar o código que será adicionado ao jQuery que por padrão utiliza esses arquivos para validação:

  • jquery.js
  • jquery.validate.js
  • jquery.validate.unobtrusive.js

dentre os atributos criados um em especial que é data-val-more-than que é o responsável pela validação ao lado do cliente e o atributo data-val-more-than-field especificando qual elemento da tela deve ser conferido o seu valor.

O código Javascript jQuery a seguir vai conferir os dados antes do envio para o servidor, exemplo:

e isso vai garantir menos uso de processamento de servidor e economia de banda.

Outro fator muito importante e uma dúvida geral dos desenvolvedores que estão iniciando em perguntar qual é para fazer? visto que nesse tutorial são duas verificações que são feitas uma lado cliente e a outra o lado do servidor para a mesma validação?

R: a resposta é simples a do Servidor sempre deve existir, independente de qualquer coisa, porque a que é feita do lado do cliente por ser desabilitado o Javascript acarretando problemas de modelos inválidos para o seu controller, mas, é sempre bom fazer as duas uma ajudando a outra em tratar os dados em sua maior totalidade, deixando a do servidor com característica total de validação do modelo.

Nas fotos abaixo um sequencia de como funciona essa validação:

Modelo sendo validado
Modelo sendo validado onde o valor inicial sempre menor do que o valor final
Modelo sendo validado e passou em todas as validações

essas três imagens são a validação cliente agora vamos ver o resultado na validação do servidor:

Modelo foi validado na parte do servidor

ou seja, as validações foram feitas e o modelo é válido.

Existem algumas validações que fica como de exemplo em codificar:

  • Verificar CNPJ
  • Verificar CPF
  • Verificar Data no formato Brasileiro
  • Verificar Valores monetários

e outras com qualquer tipo de verificação que possa ser uma regra de negócio da sua aplicação e queria padronizar os seus modelos.

Código fonte

Referencias:

Bacharel em Sistemas de Informação, MTAC (Multi-Plataform Technical Audience Contributor-Microsoft), BackEnd C# e PHP e Developer Web

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store