C# -  Validação manual com Data Annotations


Hoje veremos como podemos realizar a validação de dados usando o recurso Data Annotations em projetos C#.

A validação dos dados é a primeira e mais importante etapa na proteção de um aplicativo. Ela impede que o aplicativo processe entradas indesejadas que podem produzir resultados imprevisíveis.

A plataforma .NET oferece o recurso conhecido como DataAnnotation presente no namespace System.ComponentModel.DataAnnotations que possui várias classes e atributos para nos ajudar a validar dados.

Este recurso é muito usado no framework ASP .NET Core MVC mas podemos usá-lo em outros tipos de projetos como um projeto Console.

Vejamos isso na prática...

Validando com Data Annotations

Crie um projeto Console do tipo .NET Core chamado CShp_Validacao1;

Inclua uma referência no projeto ao pacote System.ComponentModel.Annotations da seguinte forma:

1- Clique com o botão direito do mouse sobre a Solution;

2- No menu suspenso clique em Manage Nuget Packages for Solution;

3- Na janela clique na guia Browse e selecione o pacote:

Vamos criar em nosso projeto a classe Cliente com 3 propriedades: Nome, Email e Idade e vamos aplicar os atributos DataAnnotations para realizar a validação destes dados:

using System;
using System.ComponentModel.DataAnnotations;
namespace CShp_Validacao1
{
    public class Cliente
    {
        [Required(ErrorMessage = "O email deve ser informado", AllowEmptyStrings = false)]
        [EmailAddress(ErrorMessage ="Formato do email inválido")]
        public string Email { get; set; }
        [Required(ErrorMessage ="O nome deve ser informado")]
        [MinLength(3,ErrorMessage ="Nome inválido, informe no mínimo 3 caracteres")]
        [MaxLength(50, ErrorMessage = "Nome excedeu o tamanho permitido")]
        public string Nome { get; set; }
        [Required(ErrorMessage = "O Idade deve ser informada")]
        [Range(18, 99, ErrorMessage ="A idade deve estar entre 18 e 99")]
        public int Idade { get; set; }
    }
}

Para realizar a validação dos dados estamos usando os atributos DataAnnotations:

Observe que podemos personalizar as mensagens de erro a serem exibidas.

Agora para realizar a validação dos dados temos que fazer o seguinte:

  1. Criar uma instância da classe a ser validada;
  2. Criar uma instância da classe ValidationContext que descreve o contexto onde será realizada a validação;
  3. Usar o método TryValidateObject() da classe Validator;
  4. Criar uma lista para tratar os erros usando o container ValidationResult para os resultados da validação;

A classe Validator define uma classe auxiliar que pode ser usada para validar objetos, propriedades e métodos quando ela está incluída em seus atributos ValidationAttribute associados.

No método Main abaixo temos o código que implementa a validação :

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace CShp_Validacao1
{
    class Program
    {
        static void Main(string[] args)
        {
            //cria a instância da classe Cliente
            Cliente cliente = new Cliente();
            // O Email deve ter um formato válido a@b.c
            cliente.Email = "formato inválido de email";
            // A idade deve estar entre 18 e 99
            cliente.Idade = 150;
            //O nome deve ter no mínimo 3 caracteres
            cliente.Nome = "Zé";
            //cria a instância de ValidationContext
            var ctx = new ValidationContext(cliente);
            // Criando uma lista para tratar o resultado da validação
            var resultados = new List<ValidationResult>();
            if (!Validator.TryValidateObject(cliente, ctx, resultados, true))
            {
                foreach (var erros in resultados)
                {
                    Console.WriteLine($"Erro de validação : {erros}");
                }
            }
            Console.ReadLine();
        }
    }
}

Executando o projeto iremos obter o resultado abaixo:

Vemos acima o resultado da validação implementada com os atributos Data Annotations.

Você ainda pode criar seus próprios atributos de validação. Para isso basta estender da classe base ValidationAttribute e sobrescrever o método ValidationResult.

Como exemplo vamos criar um atributo chamado DivisibilidadePorSeteAttribute que valida se número é divisível por 7. Vamos então criar uma classe chamada DivisibilidadePorSeteAttribute com o código abaixo:

using System.ComponentModel.DataAnnotations;
namespace CShp_Validacao1
{
    class DivisibilidadePorSeteAttribute : ValidationAttribute
    {
        public DivisibilidadePorSeteAttribute(): base("{0} não é divisível por 7")
        {}
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            int valor = (int)value;
            bool valido = valor % 7 == 0;
            if (valido)
                return null;
            return new ValidationResult(base.FormatErrorMessage(validationContext.MemberName)
                , new string[] { validationContext.MemberName });
        }
    }
}

Agora vamos incluir uma propriedade Numero na classe Cliente e usar o atributo criado:

using System;
using System.ComponentModel.DataAnnotations;
namespace CShp_Validacao1
{
    public class Cliente
    {
         ...
         ...
         [DivisibilidadePorSete]
         public int Numero { get; set; }
    }
}

Agora vamos atribuir um valor à propriedade :  cliente.Numero = 11;

Executando o projeto novamente teremos o resultado a seguir:

Pegue o projeto completo aqui: CShp_Validacao1.zip

"Por isso não desfalecemos; mas, ainda que o nosso homem exterior se corrompa, o interior, contudo, se renova de dia em dia."
2 Coríntios 4:16

Referências:


José Carlos Macoratti