Saia do Loop - Data Annotation.
Tags: beginners, csharp, dotnet, fcarvalhodev
Published: 2023-09-20 01:07:39

Bem vindo a série <u>**Saia do Loop**</u> ! No tutorial de hoje nós vamos falar de Data Annotation (ou anotações de dados) que existem dentro da programação C#. Dito isso, vamos começar criando um projeto vázio de console utilizando qualquer versão do .Net 3.1 para cima em nosso Visual Studio Community.

![Aplicação vazia .Net e C#](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hbv7jq0skzx1qbn0t6wv.png)

Vamos começar criando uma nova classe chamada Pessoa. Para isso no seu projeto, clique com o botão direito e em seguida clique em <u>Add </u>e em seguida <u>Class</u>.

Na classe Pessoa.cs que criamos, vamos adicionar alguns campos. Sendo eles Nome, Idade e Data de Nascimento.

```
 public class Pessoa
    {
        public string Nome { get; set; }
        public int Idate { get; set; }
        public DateTime DataDeNascimento { get; set; }
    }
```

Ótimo, com o nosso objeto Pessoa criado, vamos entender agora como as Data Annotation funcionam. As datas annotations são usadas para import regras em **propriedades** de classe. Por exemplo, em nosso objeto **Pessoa** nós queremos que o nome seja obrigatório e que tenha no mínimo 3 caractéres. Ou seja, todo nome precisa ter ao menos 3 letras para ser considerado um nome válido.

Dito isso, usando data annotation nós podemos criar essa regra diretamente em nossa propriedade, veja o exemplo abaixo:

```
    public class Pessoa
    {
        [Required]
        [MinLength(3, ErrorMessage = "Nome precisa ter pelo menos 3 caracteres.")]
        public string Nome { get; set; }
        public int Idade { get; set; }
        public DateTime DataNascimento { get; set; }
    }

```

No exemplo anterior, nós incluímos duas notações (data annotation) a **<u>Required</u>** e **<u>MinLenght</u>**, sendo que na segunda, nós passamos 2 parâmetros, o primeiro é o número mínimo de caractéres que é 3, e em seguida definimos uma mensagem de erro.

Para entender mais, a Microsoft tem uma excelente documentação sobre que você pode ver neste [link](https://learn.microsoft.com/pt-br/aspnet/mvc/overview/older-versions-1/models-data/validation-with-the-data-annotation-validators-cs).

Mas continuando, ao incluir as anotações e dados em seu código, você deverá notar que automaticamente um novo **using** será adicionado a sua classe.

![código c# e using](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0t3m3cne84kb7vemcddl.png)

Este using é necessário para utilizarmos as anotações, então tenha atenção para não esquecer a sua referência. Dito isso, vamos incluir mais anotações para os demais campos.

* O campo idade deverá ter entre 0 e 150 anos
* O campo de data devera ser válido, e não ser menor que 1900 ou maior que 31/12/2099

```
    public class Pessoa
    {
        [Required]
        [MinLength(3, ErrorMessage = "Nome precisa ter pelo menos 3 caracteres.")]
        public string Nome { get; set; }

        [Range(0, 150, ErrorMessage = "Idade deve ser entre 0 e 150.")]
        public int Idade { get; set; }

        [DataType(DataType.Date)]
        [Range(typeof(DateTime), "1/1/1900", "12/31/2099", ErrorMessage = "Data fora do intervalo permitido.")]
        public DateTime DataNascimento { get; set; }
    }
```

Preste anteção que a princípio a data está no formato americano, isso se deve porquê por padrão a anotação valida no formato americano, para formatar e validar no padrão brasileiro, é necessário construir uma anotação customizada.

Por exemplo, caso tivéssemos a seguinte classe em nosso projeto:

```
   public class BrazilianDateAttribute : ValidationAttribute
    {
     public DateTime MinDate { get; set; }
        public DateTime MaxDate { get; set; }

        public BrazilianDateAttribute(string minDate, string maxDate)
        {
            MinDate = DateTime.ParseExact(minDate, "dd/MM/yyyy", CultureInfo.InvariantCulture);
            MaxDate = DateTime.ParseExact(maxDate, "dd/MM/yyyy", CultureInfo.InvariantCulture);
        }

        public override bool IsValid(object value)
        {
            DateTime date;
            var isValid = DateTime.TryParseExact(
                Convert.ToString(value),
                "dd/MM/yyyy",
                CultureInfo.CurrentCulture,
                DateTimeStyles.None,
                out date
            );

            return isValid && date >= MinDate && date <= MaxDate;
        }
```
Poderiamos usar a validação da seguinte maneira:

  

```
public class Pessoa
    {
        [Required]
        [MinLength(3, ErrorMessage = "Nome precisa ter pelo menos 3 caracteres.")]
        public string Nome { get; set; }

        [Range(0, 150, ErrorMessage = "Idade deve ser entre 0 e 150.")]
        public int Idade { get; set; }

        [BrazilianDate("01/01/1900", "31/12/2099", ErrorMessage = "Data fora do intervalo permitido.")]
        public DateTime DataNascimento { get; set; }
    }
```

Com isso, dentro de nossa Program.cs, estamos prontos para criar um exemplo em nosso método Main e testarmos as validações:

```
static void Main(string[] args)
        {
            var pessoa = new Pessoa
            {
                Nome = "Jo", //Nome incorreto
                Idade = -1, //Idate incorreta
                DataNascimento = new DateTime(3000, 1, 1) // Data fora do intervalo
            };

            var results = new List<ValidationResult>();
            var isValid = Validator.TryValidateObject(pessoa, new ValidationContext(pessoa), results, true);

            if (!isValid)
            {
                foreach (var validationResult in results)
                {
                    Console.WriteLine(validationResult.ErrorMessage);
                }
            }

            Console.ReadKey();
        }
```

Execute, a aplicação e veja os erros que irão acontecer no console.


![Erros](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/izx4o4d10odj29nxrhht.png)

E pronto, com isso você já deve entender a ideia do que são as Data Annotations, um famoso recurso do C#.

Nos vemos no próximo tutorial! :)