ASP.Net MVC – Validando e-mail com DataAnnotations

Olá pessoal,

Recentemente passei por um problema e gostaria de compartilhar a solução neste artigo.

Irei utilizar um projeto padrão do tipo MVC 4 – Internet Application do Visual Studio, este projeto já vem por padrão com o registro de usuários e controle do login com FormsAuthentication implementado.

Neste projeto temos uma área de registro de novos usuários e irei customizar para que o nome de usuário seja um e-mail, para isso é necessário que haja a validação no momento da criação do novo usuário.

Aqui está a Model AccountModels.cs original:

using System.ComponentModel.DataAnnotations;

public class RegisterModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

Para que haja a validação é necessário decorar a propriedade do campo usuário (UserName), caso você pesquise na internet irá encontrar várias referências orientando a fazer a validação desta forma:

    [Required]
    [Display(Name = "User name")]
    [DataType(DataType.EmailAddress, ErrorMessage = "E-mail em formato inválido.")]
    public string UserName { get; set; }

No momento do registro não irá funcionar a validação do formato de e-mail, ou seja, um usuário com nome “Teste” será registrado sem ser barrado pela validação.

Explicação:
Aparentemente seria essa a proposta do atributo DataType, mas não, o atributo DataType é usado apenas para formatação e não validação.

No .Net Framework 4.5 há um novo atributo System.ComponentModel.DataAnnotations.EmailAddressAttribute, que é um tipo de atributo utilizado justamente para validação, sua aplicação inclusive é mais fácil:

    [Required]
    [Display(Name = "User name")]
    [EmailAddress(ErrorMessage = "E-mail em formato inválido.")]
    public string UserName { get; set; }

Utilizei o parâmetro ErrorMessage para definir a frase de erro a ser exibida, em outros casos basta usar o parâmetro [EmailAddress] que a validação será feita:

Lembrando que ainda existe a possibilidade de fazer a validação utilizando expressões regulares:

    [Required]
    [Display(Name = "User name")]
    [RegularExpression(@"b[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}b", ErrorMessage = "E-mail em formato inválido.")]
    public string UserName { get; set; }

É isso pessoal, uma dica simples mas que pode salvar algum tempo do seu trabalho 🙂

Até a próxima.

13 pensou em “ASP.Net MVC – Validando e-mail com DataAnnotations

  1. Eduardo, agora mesmo estava batendo a cabeça com esse mesmo problema…MUITO OBRIGADO!!!

    Parabéns!

  2. Uma dúvida caro colega, que nada tem a ver com o seu artigo, peço desculpas por fugir do tema central.,O eu atributo de confirmar password, é também coluna da tabela no banco de dados? Estou com esse problema e não estou conseguindo resolver, sem criar o um campo no banco. Porém não vejo necessidade de guardar duas vezes a senha, sabe uma maneira elegante de resolver esse problema

    Obrigado

    • Olá Rafael,

      Esse problema acontece pois é necessário usar uma ViewModel para isso e não a model que é persistida no banco, mas de qq forma você pode usar o atributo:
      [NotMapped]

      Ai ele não cria o campo no banco.

      Abs!

  3. Eduardo, se eu trabalhar diretamente com a model no meu cshtml, essas validações do dataannotations serão executadas no client ou no server? Por exemplo, se eu renderizar o campo com TextBoxFor o fw mvc vai saber que tem que executar essas validações entes de dar o post?
    Obrigado

  4. e se eu quiser validar mais de um email, ex.: quero mandar o email para mais de um destinatário, como faria ? pois essa validação só aceita um email.

Os comentários estão fechados.