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.
Mto útil. Parabéns!
Realmente é algo que as pessoas vão procurar.
[]s!
Valeu Fê!
Abraços!!!
Eduardo, agora mesmo estava batendo a cabeça com esse mesmo problema…MUITO OBRIGADO!!!
Parabéns!
Fala Diego!
Legal, feliz em ter ajudado! Abs!!!
Com o framework 4.0 funcionará a validação feita por expressão regular?
Grato
Olá Fabiano!
Continua tudo igual… Abs!
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!
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
O problema da expressão regular é que não aceita ponto no meio
Ex: [email protected]
pelo menos não consegui
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.
ASP.Net MVC – Validando e-mail com DataAnnotations – Eduardo Pires Tava precisando de limpar uma lista de emails, e achei o site http://www.validadordeemails.com.br usei e limpei minhas listas de e-mail, realmente é muito bom, tem uns filtros avançados legais… Pra quem quiser retirar e-mails inválidos, uso e indico para meus amigos o site http://www.validadordeemails.com.br muito bom mesmo galera 🙂
Demaaaaaaais, muito util! Obrigado!