Validação de endereço de email usando atributos de tipo de dados ASP.NET MVC

163

Estou com alguns problemas com a validação de um email.

No meu modelo:

[Required(ErrorMessage = "Field can't be empty")]
[DataType(DataType.EmailAddress, ErrorMessage = "E-mail is not valid")]
public string ReceiverMail { get; set; }

Na minha opinião:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Html.TextBoxFor(m => m.ReceiverMail, new { @placeholder="E-mail"}) <br />
@Html.ValidationMessageFor(m => m.ReceiverMail)

Agora, ele está me mostrando corretamente "O campo não pode estar vazio" quando você deixa o campo em branco. Mas quando você preenche um endereço de e-mail inválido como: "fwenrjfw", o formulário não diz "E-mail não é válido".

Como posso obter o formulário para validar a entrada como um endereço de email? Estou procurando alguma ajuda com isso.

Java Afca
fonte

Respostas:

327

Se você estiver usando o .NET Framework 4.5, a solução é usar o EmailAddressAttributeque reside dentro System.ComponentModel.DataAnnotations.

Seu código deve ser semelhante a este:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
Shittu Joseph Olugbenga
fonte
Obrigado @Shittu Olugbenga! Mas eu não posso entender por que isso não funciona:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli
15
@Wellington Zanelli - O DataType (DataType.EmailAddress) não pode ser usado para validar a entrada do usuário. Ele é usado apenas para fornecer uma dica de interface do usuário para renderizar os valores usando os modelos de exibição / editor.
Liam
3
@Jni DataType.EmailAddressnão é sobre validação. Trata-se de apresentação de dados ...
Sebastian Xawery Wiśniowiecki 19/05/2015
3
Tenho o mesmo problema e, para mim, a validação de email funciona bem, exceto para emails como 'name @ xxx'. alguém mais viu isso?
Kremena Lalova 3/11
3
O @KremenaLalova name@xxxé um endereço de email completamente válido, portanto não há nada errado com esse método. Considere o exemplo, username@localhostpor exemplo.
John Bergman
39

Tente o Html.EditorFormétodo auxiliar em vez de Html.TextBoxFor.

hazimdikenli
fonte
1
Esta é a resposta correta, pois ela usará o tipo de dados e o erro que você já adicionou ao seu modelo.
Ricardo Sanchez
4
este método não verifica TLD de domínio, de modo que alguém poderia colocar em myname @ o que quer e deixar de fora .com e ele irá validar corretamente
JasonH
8
myname @ tudo o que é um endereço de email válido
michaelmsm89
Funcionou perfeitamente para o mvc 4. Obrigado.
Jose Gomez
O que escrever dentro do html.Editor para validar e-mail?
precisa
28

Você precisa usar o atributo RegularExpression, algo como isto:

[RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "E-mail is not valid")]

E não exclua [Obrigatório] porque [Expressão regular] não afeta campos vazios.

Alexander Imra
fonte
8
O skool antigo é bom, mas desde que a Microsoft implementou um atributo, ele resolve erros e omissões que podem ocorrer em determinadas situações, países, fusos horários ou planetas. Portanto, é melhor usar uma base de código totalmente liberada do que a regex personalizada. Seu regex leva em consideração os novos domínios de nível superior, por exemplo?
Piotr Kula
2
Esse regex parece que falhará em qualquer endereço de email com caracteres estrangeiros ou muitos caracteres não padrão nele.
EricP
2
Validar endereços de email com regex é geralmente uma idéia terrível ... mas se for preciso, há uma excelente referência aqui .. regular-expressions.info/email.html
Molomby
9
Este regex e site estão incorretos. Existem muitos novos TLDs com mais de 6 caracteres. Não siga este.
jsgoupil
14

se você ainda não estiver usando o .net 4.5:

/// <summary>
/// TODO: AFTER WE UPGRADE TO .NET 4.5 THIS WILL NO LONGER BE NECESSARY.
/// </summary>
public class EmailAnnotation : RegularExpressionAttribute
{
    static EmailAnnotation()
    {
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAnnotation), typeof(RegularExpressionAttributeAdapter));
    }

    /// <summary>
    /// from: http://stackoverflow.com/a/6893571/984463
    /// </summary>
    public EmailAnnotation()
        : base(@"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
            + "@"
            + @"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$") { }

    public override string FormatErrorMessage(string name)
    {
        return "E-mail is not valid";
    }
}

Então você pode fazer isso:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }
McFEA
fonte
1
Eu gosto do construtor estático.
Brian Sweeney
1
@BrianSweeney, não posso receber crédito por isso: P. Mais um petisco que recebi daqui anos atrás.
28619 mcfea
10

Eu uso o MVC 3. Um exemplo de propriedade de endereço de email em uma das minhas classes é:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[Email(ErrorMessage = "The email address is not valid")]
public string Email { get; set; }

Remova o Requiredse a entrada for opcional. Não há necessidade de expressões regulares, embora eu tenha uma que cubra todas as opções em um endereço de e-mail até o nível RFC 2822 (é muito longo).

Peter Smith
fonte
3
Em que namespace está o seu atributo Email? Ou é um atributo personalizado?
Utilizador
5
MVC 4 usos [EmailAddress]e você precisa terusing System.ComponentModel.DataAnnotations;
Piotr Kula
1
Parece que não importa o que eu faça, o uso de qualquer um Emailou RegularExpressiontorna o campo obrigatório. A remoção da Requiredanotação não tem efeito. Alguma sugestão sobre o que fazer para tornar os campos com RegularExpressionvalidação aceitar campos vazios?
Eric K
@QuantumDynamix Tente adicionar um teste de string vazio à sua expressão regular como uma opção. Nunca tentei, mas quem sabe?
9788 Peter St Smith
7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }
Kuganrajh Rajendran
fonte
4

Utilizado o código acima no projeto MVC5 e ele funciona completamente bem com o erro de validação.

   [Required]
   [Display(Name = "Email")]
   [EmailAddress]

   [RegularExpression(@"^([A-Za-z0-9][^'!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ][a-zA-z0- 
    9-._][^!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ]*\@[a-zA-Z0-9][^!&@\\#*$%^?<> 
        ()+=':;~`.\[\]{}|/,₹€ ]*\.[a-zA-Z]{2,6})$", ErrorMessage = "Please enter a 
   valid Email")]


   public string ReceiverMail { get; set; }
Kalyani Rathore
fonte
1
Bem-vindo ao StackOverflow. As respostas somente de código não são consideradas uma boa prática. Por favor, elabore o que isso faz e como resolve o problema.
quinz 6/06/19
0

Os scripts geralmente são carregados no final da página html, e o MVC recomenda o uso de pacotes, apenas dizendo. Então, minha melhor aposta é que vocêjquery.validate arquivos foram alterados de alguma forma ou não são atualizados para a versão mais recente, pois validam as entradas de email.

Então você pode atualizar / atualizar seu pacote nuget ou escrever sua própria função, realmente.

Aqui está um exemplo que você adicionaria em um arquivo extra depois jquery.validate.unobtrusive:

$.validator.addMethod(
    "email",
    function (value, element) {
        return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
    },
    "This e-mail is not valid"
);

Isso é apenas uma cópia e colagem do jquery.validateRegex atual , mas dessa maneira você pode definir sua mensagem de erro personalizada / adicionar métodos extras aos campos que você deseja validar no futuro próximo.

Tiramônio
fonte
0

Conforme descrito acima, isso corrigirá a validação no servidor de um endereço de email:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

Contudo...

Se você estiver usando a validação do lado do cliente JQuery, deverá saber que o Email valida diferentemente do lado do servidor (validação do modelo) para o lado do cliente (validação do JQuery). Nesse teste @ exemplo (um endereço de e-mail de domínio de nível superior) falhava no lado do servidor, mas validava bem no lado do cliente.

Para corrigir essa disparidade, você pode substituir a validação de email padrão do lado do cliente da seguinte maneira:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
Jon Ryan
fonte