Atributo para validar E-mails utilizando Data Annotation em Asp.Net MVC 4 com C# (CSharp)

Autor : Antonio Carlos Ferreira de Azevedo
Postado em : 24/04/2016

Data Annotation Custumizado [EmailBrasil()]

Nesta postagem você vai aprender a validar um campo string no formato e-mail email@dominio.com ou email@dominio.com.br usando Data Annotation e jquery.validate onde será feita a validação tanto do lado do cliente como no servidor.
Vamos criar aqui uma classe derivada da ValidationAttribute e criar nossa classe customizada para a validação no servidor.

EmailBrasilAttribute

ErrorMessage Mensagem padrão de erro.
EmailRequerido True Se a digitação do e-mail é obrigatória False se a digitação do e-mail não é obrigatória.

Crie uma classe na pasta Models em seu projeto MVC com o nome de EmailBrasilAttribute.cs copie e cole o código abaixo.

EmailBrasilAttribute.cs

/* 
 * Atributo EmailBrasil
 * 
 * Data Annotations para Validar uma hora no formato hh:mm.
 * 
 * Visite nossa página http://www.codigoexpresso.com.br
 * 
 * by Antonio Azevedo
 *  
 * Chamada em sua Classe : 
 *   [EmailBrasil(ErrorMessage="Sua mensagem de erro", EmailRequerido=true/false)]
 *    
 *   EmailRequerido  -  (False) - Valida emails em branco 
 *   
 */
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
using System.Web.Mvc;

public class EmailBrasilAttribute : ValidationAttribute, IClientValidatable
{

    public Boolean EmailRequerido { get; set; }
 
    public EmailBrasilAttribute()
    {
        this.ErrorMessage = "E-mail inválido.";
        this.EmailRequerido = false;
        
    }

    protected override ValidationResult IsValid(
        object value,
        ValidationContext validationContext)
    {

        // Verifica se o Valor é nulo
        if (value == null)
        {
            value = "";
        }

        // Retira espaços do final da literal
        value = value.ToString().TrimEnd();

        // Caso o valor informado seja nulo não é requerido retorna sem validar
        if (value == "" && EmailRequerido == false)
        {
            return ValidationResult.Success;
        }


        // Atribui expressao Regex
        Regex regExpEmail = new Regex(@"^[a-zA-Z]+(([\'\,\.\- ][a-zA-Z ])?[a-zA-Z]*)*\s+<(\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3})>$|^(\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3})$");                  


        // Valida a expressao
        Match match = regExpEmail.Match(value.ToString());

        if (match.Success)
        {
            return ValidationResult.Success; ;
        }

        // Devolve o erro padrao se a expressao nao for valida.
        return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));        
    }

    // Diretivas para validação do lado do Cliente, implementa com jquery.validate
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
        ModelMetadata metadata,
        ControllerContext context)
    {
        var Rule = new ModelClientValidationRule
        {
            ValidationType = "emailbrasil",
            ErrorMessage = this.FormatErrorMessage(metadata.PropertyName)

        };
    
        Rule.ValidationParameters["emailrequerido"] = EmailRequerido;

        yield return Rule;
    }   
}

Agora vamos cuidar da validação do lado no cliente, ou seja, no navegado do cliente.
O MVC se encarrega de transportar os parametros para nosso HTML mas mesmo assim temos que fazer toda a validação em JavaScript novamente.

Crie uma arquivo JavaScript na pasta Scripts de seu projeto MVC, de o nome de CustomValidacoes.js copie e cole o código abaixo.

CustomValidacoes.js

// Aqui adicionamos os metodos respeitando os nomes gerado em nossa classe atributo
// os nomes devem estar em caixa baixa tanto na integração como aqui no JavaScript (Nome atributo, parametro)
$.validator.unobtrusive.adapters.addSingleVal('emailbrasil', 'emailrequerido');

//Aqui temos a funcao que Valida do lado do cliente o e-mail digitado utilizando uma expressão regular
$.validator.addMethod('emailbrasil',
function (value, element, emailrequerido) {

    // Retira espaços do final da literal
    value = value.trim();

    // Valida caso o valor não tenha sido preenchido
    if (value.length == 0) {
        if (emailrequerido.toString() == "True")
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    // Atribui expressão
    var expReg = /^[a-zA-Z]+(([\'\,\.\- ][a-zA-Z ])?[a-zA-Z]*)*\s+<(\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3})>$|^(\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3})$/;
   
    // Valida Expressao
    var result = value.match(expReg);

    // Retorna false caso a expressao nao seja valida
    if (result != null) {
        return true;
    }

    return false;
});

Este arquivo deve ser carregado após o carregamento do jquery.validate.

Exemplo de como utilizar o atributo em sua classe.

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using SeuProjeto.Models;

namespace AspNetMVC_Aula.Models
{
    public class ModAluno
    {
       [EmailBrasil(ErrorMessage = "E-mail inválido", EmailRequerido = false )]
       public string? Email { get; set; }
    }
}







Comentários

Antonio Azevedo (Administrador) em 27/09/2016 15:39:39
 

Realizei teste baixando novamente o código em uma nova aplicação e esta rodando tudo perfeitamente, se possível envie seu código para contato@codigoexpresso.com.br e vou verificar o que pode estar acontecendo, obrigado.


Antonio Azevedo (Administrador) em 26/09/2016 15:34:30
 

Comigo não estava apresentando erro fiz uma modificação em 22/08/2016 e utilizei esta base mesmo em minhas Vídeo Aulas, vou fazer um teste mais depurado para ver se apresenta algum erro, dou o retorno mais tarde.


Marcus em 25/09/2016 14:24:54
 

Boa tarde Antonio, gostaria antes de mais nada agradecer demais pelo conhecimento que estou adquirindo através das vídeos aulas, belíssimo trabalho! Gostaria também de tirar uma dúvida sobre o uso no EmailBrasil. Não estou conseguindo que emails .com.br sejam aceitos, somente .com. Já tentei mudar o regex, porém ainda continua o erro. Desde de já agradeço e parabenizo novamente pelo trabalho.

Atenciosamente, Marcus Louzada


Antonio Azevedo (Administrador) em 22/08/2016 21:59:04
 

Correção, retirada de espaços no final da literal antes de validar, comigo não havia apresentado o erro mas um usuário estava com problemas.