Validando as suas ViewModels no asp.net mvc com FluentValidation

É comum, quando trabalhamos com asp.net mvc, utilizarmos as anotações presentes em System.ComponentModel.DataAnnotations. Conseguimos um resultado bacana, validamos de maneira simples as nossas view models e o código fica relativamente simples. Um exemplo simples do que eu estou falando é o seguinte:

Imagine que temos o clássico LoginModel, contendo o usuário, senha e a url de retorno após o sucesso no login:

    public class LoginModel
    {
        public string Email { get; set; }
        public string Senha { get; set; }
        public string ReturnUrl { get; set; }
    }

Após identificarmos que os campos Email e Senha são obrigatórios, podemos rapidamente resolver este problema adicionando um [Required] para cada propriedade obrigatória:

    public class LoginModel
    {
        [Required]
        public string Email { get; set; }

        [Required]
        public string Senha { get; set; }

        public string ReturnUrl { get; set; }
    }

O código continua simples, legível, bonito. Porém, não é comum precisarmos adicionar mais de uma validação para cada propriedade. E cada anotação pode ter vários parâmetros, como mensagens, nome de resources, etc. Podemos sair de uma classe simples e de fácil leitura, para situações mais complexas, onde o entendimento da classe fica comprometido pelo excesso de anotações:

        [DataType(DataType.EmailAddress)]
        [Required(ErrorMessage = "É necessário informar um Email")]
        [StringLength(150, ErrorMessage = "O Email deve conter entre 3 e 150 caracteres", MinimumLength = 3)]
        public string Email { get; set; }

        [DataType(DataType.Password)]
        [Required(ErrorMessage = "É necessário informar uma Senha")]
        [StringLength(30, ErrorMessage = "A Senha deve conter entre 6 e 30 caracteres", MinimumLength = 6)]
        public string Senha { get; set; }

        public string ReturnUrl { get; set; }

Conforme vamos abusando dos atributos, nossa classe vai perdendo a simplicidade, e com isso levamos mais tempo para realizar o entendimento, podemos cometer algum engano, etc. Isso sem falar quando precisamos fazer alguma validação server-side, como duplicidade de conteúdo, etc. Para isolarmos a responsabilidade de validação das nossas classes, podemos utilizar uma biblioteca bacana, chamada FluentValidation.

Para utilizarmos o FluentValidation, basta adicionarmos o seguinte pacote via nuget:

Install-Package FluentValidation

Agora podemos começar a criar as nossas validações em uma classe apartada. Para criar uma classe de validação, basta herdar da classe AbstractValidator e adicionarmos as validações em seu construtor:

    public class LoginModelValidator : AbstractValidator<LoginModel>
    {
        public LoginModelValidator()
        {
            RuleFor(x => x.Email)
                .NotEmpty().WithMessage("É necessário informar um Email")
                .Length(3, 150).WithMessage("O Email deve conter entre 3 e 150 caracteres");

            RuleFor(x => x.Senha)
                .NotEmpty().WithMessage("É necessário informar uma Senha")
                .Length(6, 30).WithMessage("A Senha deve conter entre 6 e 30 caracteres");
        }
    }

Agora basta anotarmos a nossa viewmodel:

    [Validator(typeof(LoginModelValidator))]
    public class LoginModel
    {
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        [DataType(DataType.Password)]
        public string Senha { get; set; }
        
        public string ReturnUrl { get; set; }
    }

Agora para utilizarmos junto com o asp.net mvc, podemos adicionar o pacote:

Install-Package FluentValidation.MVC5

Existe uma versão para o mvc 3, 4, 5, 6, web api, etc. Basta conferir no repositório do projeto: https://github.com/JeremySkinner/FluentValidation

Agora que já adicionamos a versão que você está utilizando, basta adicionar a seguinte linha em Application_Start dentro do seu Global.asax:

FluentValidationModelValidatorProvider.Configure();

E pronto, suas classes estão sendo validadas de acordo com o Validator criado. Existem algumas validações já criadas e prontas para o uso, como:

  • NotNull
  • NotEmpty
  • NotEqual
  • Length
  • LessThan
  • LessThanOrEqual
  • etc

 
Você pode conferir a documentação no wiki do projeto.

Bom, por hoje é só 😉

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s