ASP .NET Core 3.1 - Validação Customizada do Model


Hoje vamos recordar como realizar a validação customizada do modelo na ASP .NET Core.

A forma mais simples de realizar a validação do modelo é usar os atributos de validação da Data Annotations definida no namespace System.ComponentModel.DataAnnotations.

Acontece que se tivermos um requisito de validação complexo que não possa ser implementado usando os atributos internos, podemos criar um atributo de validação personalizado e reutilizá-lo em nosso projeto ou mesmo em vários projetos.

Para isso podemos criar atributos de validação personalizados, e, fazemos isso criando uma classe que herda da classe ValidationAttribute e a seguir substituímos o método IsValid.

O método IsValid aceita um objeto chamado value, que é a entrada a ser validada. Uma sobrecarga também aceita um objeto ValidationContext, que fornece informações adicionais, como a instância do modelo criada pelo model binding.

A classe ValidationAttribute é a classe base para todos os atributos de validação e possui os seguintes métodos:

Métodos
Descrição
GetValidationResult(Object, ValidationContext)
Verifica se o valor especificado é válido com relação ao atributo de validação atual.
IsDefaultAttribute()
Quando substituído em uma classe derivada, indica se o valor dessa instância é o valor padrão para a classe derivada. Herdado de Attribute.
IsValid(Object)
Determina se o valor especificado do objeto é válido
IsValid(Object, ValidationContext)
Valida o valor especificado com relação ao atributo de validação atual.
MemberwiseClone()
Cria uma cópia superficial do objeto atual. É herdado do objeto
ToString()
Retorna uma sequência que representa o objeto atual. É herdado do objeto
Validate(Object, String)
Valida o objeto especificado.
Validate(Object, ValidationContext)
Valida o objeto especificado

Para mostrar como utilizar este recurso vamos criar uma aplicação ASP .NET Core MVC 3.1 usando o EF Core 3.1 onde vamos fazer um CRUD básico em informações de funcionários.

Veja como foi criada esta aplicação acessando este link :  ASP .NET Core MVC - Funcionarios

Você pode baixar o projeto, descompactar e abrir no VIsual Studio 2019 para continuar acompanhando o artigo.

Agora com base nesta aplicação quando vamos criar um novo funcionário temos a seguinte página sendo exibida:

Vamos supor que precisamos permitir somente os emails com domínio yahoo.com sejam permitidos.

Se outro nome de domínio for usado vamos exibir uma mensagem de erro de validação.

Então vamos implementar uma validação customizada com base neste requisito criando um atributo de validação personalizado.

Para isso vamos criar uma classe chamada ValidaDominoEmailAttribute que herda da classe ValidationAttribute e vamos sobrescrever o método IsValid() :

Crie a pasta Validacao no projeto e a seguir crie a clases ValidaDominioEmailAttribute com o código abaixo:

using System.ComponentModel.DataAnnotations;
namespace FuncionariosWeb.Validacao
{
    public class ValidaDominioEmailAttribute : ValidationAttribute
    {
        private readonly string dominioPermitido;
        public ValidaDominioEmailAttribute(string dominioPermitido)
        {
            this.dominioPermitido = dominioPermitido;
        }
        public override bool IsValid(object value)
        {
            string[] strings = value.ToString().Split('@');
            return strings[1].ToUpper() == dominioPermitido.ToUpper();
        }
    }
}

A seguir temos que complementar na classe Funcionario do modelo a inclusão do atributo ValidaDominoEmail, definido acima:

   public class Funcionario
    {
        ....
        [RegularExpression(@"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$",
        ErrorMessage = "Email com formato inválido")]
        [Required(ErrorMessage = "O Email é obrigatório")]
        [ValidaDominioEmail(dominioPermitido: "yahoo.com",
                   ErrorMessage = "O domínio do email deve ser yahoo.com")]

        public string Email { get; set; }
       ...
    }

Entendendo o que foi feito:

Agora é só alegria...

Executando o projeto e fazendo a validação do email quando da criação de um novo funcionário teremos o seguinte resultado:

Simples assim...

Pegue o projeto aqui :  IdentityTotal_Validacao.zip (sem as referências)

"Dando graças ao Pai que nos fez idôneos para participar da herança dos santos na luz;
O qual nos tirou da potestade das trevas, e nos transportou para o reino do Filho do seu amor;"
Colossenses 1:12,13

Referências:


José Carlos Macoratti