« Voltar
em ASP.NET c#

Criando anotações de validação no ASP.NET MVC.

Quando desenvolvemos software nunca podemos confiar totalmente nos dados que o usuário nos informar. É aí que entra a validação de dados.

No ASP.NET MVC, uma das formas mais legais de se fazer validação é através de anotações.
Vamos usar como exemplo a classe Funcionario:

public class Funcionario  
{
    public string Nome {get; set;}
    public string Email {get; set;}
}

Se eu quiser que o nome seja obrigatório, posso marcar ele com a anotação Required:

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

E ai quando eu for, por exemplo, adicionar um usuário, posso verificar se o modelo está válido no controller usando o ModelState:

public ActionResult Adiciona(Funcionario func)  
{
    if (ModelState.IsValid)
    {
         //faz a lógica pra adicionar funcionário
    }
}

Agora, e se o e-mail desse funcionário tem que ser de um dominio específico? Vamos dizer que tem que ser o domínio gabsferreira.com. Ou seja, o e-mail teria que ser algumacoisa@gabsferreira.com, outracoisa@gabsferreira.com.

Essa é uma validação específica do meu modelo de negócio, então não temos uma anotação pronta no MVC pra lidar com esse problema.

Poderia fazer assim então no controller(fiz da maneira mais inocente possível, sei que poderia ter usado Regular Expression):

public ActionResult Adiciona(Funcionario func)  
{
    string dominio = func.Email.Substring(func.Email.IndexOf("@"));
    if(!dominio.Equals("@gabsferreira.com"))
    {
        ModelState.AddModelError("dominio.invalido", "O dominio é inválido");
    }
    if (ModelState.IsValid)
    {
         //faz a lógica pra adicionar funcionário
    }

Isso funciona, legal.
Mas imagine que podemos adicionar funcionário em outros pontos de nossa aplicação: ficaremos copiando e colando esse código em todos esses pontos? Meio ruim né? E se a regra de validação mudar?

Podemos então criar uma anotação de validação customizada e colocar essa regra dentro dela!
Vamos lá, a primeira coisa é criar a classe DominioValidoAttribute, que herdará de ValidationAttribute:

public class DominioValidoAttribute : ValidationAttribute  
{
}

Dentro dessa classe, sobrescreveremos o método IsValid:

public class DominioValidoAttribute : ValidationAttribute  
{
    public override bool IsValid(object value)
    {

    }
}

Esse método recebe o valor da propriedade em que usarmos a anotação e faz a validação. Se a validação estiver ok, retorna true. Caso contrário, retorna false.
Vamos implementar nossa validação então:

public class DominioValidoAttribute : ValidationAttribute  
{
    public override bool IsValid(object value)
    {
        //convertendo para string
        string email = value.ToString();
        //isolando a parte da string que tem o domínio do e-mail
        string dominio = email.Substring(func.Email.IndexOf("@"));
        //validando e retornando o resultado
        return dominio.Equals("@gabsferreira.com");
    }
}

Tranquilo, né?

Agora é só usar a anotação na classe e o Model Binder do ASP.NET MVC sempre irá executar nossa regra de validação:

public class Funcionario  
{
    [Required]
    public string Nome {get; set;}
    [DominioValido]
    public string Email {get; set;}
}

Veja que não há necessidade de usarmos o sufixo Attribute usamos a anotação.
E por último: quando a validação falhar, queremos mostrar uma mensagem de erro para o usuário. Podemos então criar um construtor sem argumentos em nossa classe DominioValidoAttribute:

public class DominioValidoAttribute : ValidationAttribute  
{
    public DominioValidoAttribute : base("Domínio inválido!")
    //restante do método que fizemos anteriormente
}

Nesse código estamos chamando o construtor da classe pai que recebe um argumento do tipo string, que é a mensagem de erro que queremos usar para essa anotação.

E ai, ficou alguma dúvida? Quer saber mais? Comenta aí! (:


Já que você leu até aqui, porque não curte minha página lá no Face pra ficar em dia com as minhas postagens e outras coisas legais?
O endereço é https://www.facebook.com/devgabsferreira (:

comments powered by Disqus