Validation d'adresse e-mail à l'aide des attributs de type de données ASP.NET MVC

163

J'ai quelques problèmes avec la validation d'un Email.

Dans mon modèle:

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

À mon avis:

<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)

Maintenant, il me montre correctement "Le champ ne peut pas être vide" lorsque vous laissez le champ vide. Mais lorsque vous remplissez une adresse e-mail invalide comme: "fwenrjfw", le formulaire ne dit pas "L'e-mail n'est pas valide".

Comment puis-je obtenir le formulaire pour valider l'entrée en tant qu'adresse e-mail? Je cherche de l'aide pour cela.

Java Afca
la source

Réponses:

328

Si vous utilisez .NET Framework 4.5, la solution consiste à utiliser celui EmailAddressAttributequi réside à l'intérieur System.ComponentModel.DataAnnotations.

Votre code doit ressembler à ceci:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
Shittu Joseph Olugbenga
la source
Merci @Shittu Olugbenga! Mais je ne comprends pas pourquoi cela ne fonctionne pas:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli
15
@Wellington Zanelli - Le DataType (DataType.EmailAddress) ne peut pas être utilisé pour valider l'entrée utilisateur. Il est uniquement utilisé pour fournir une indication d'interface utilisateur pour le rendu des valeurs à l'aide des modèles d'affichage / éditeur.
Liam
3
@Jni DataType.EmailAddressn'est pas une question de validation. Il s'agit de la présentation des données ...
Sebastian Xawery Wiśniowiecki
3
J'ai le même problème et pour moi la validation par e-mail fonctionne très bien, sauf pour les e-mails tels que «nom @ xxx». Quelqu'un d'autre a-t-il vu cela?
Kremena Lalova
3
@KremenaLalova name@xxxest une adresse e-mail entièrement valide, il n'y a donc rien de mal avec cette méthode. Prenons l'exemple username@localhostpar exemple.
John Bergman du
39

Essayez la Html.EditorForméthode d'assistance au lieu de Html.TextBoxFor.

hazimdikenli
la source
1
Il s'agit de la bonne réponse car elle utilisera le type de données et l'erreur que vous avez déjà ajoutés dans votre modèle.
Ricardo Sanchez
4
cette méthode ne vérifie pas le domaine tld, donc quelqu'un peut mettre myname @ n'importe quoi et laisser .com et il validera correctement
JasonH
8
myname @ n'importe quelle adresse e-mail valide
michaelmsm89
A parfaitement fonctionné pour mvc 4. Merci.
Jose Gomez
Que écrire dans html.Editor pour valider les e-mails?
Neeraj Kumar
28

Vous devez utiliser l'attribut RegularExpression, quelque chose comme ceci:

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

Et ne supprimez pas [Obligatoire] car [RegularExpression] n'affecte pas les champs vides.

Alexandre Imra
la source
8
Old skool est sympa mais depuis que Microsoft a implémenté un attribut, il corrige les bugs et les oublis qui peuvent se produire dans certaines situations, pays, fuseaux horaires ou planètes. Il est donc préférable d'utiliser une base de code entièrement publiée plutôt qu'une expression régulière personnalisée. Votre regex prend-elle en compte les nouveaux domaines de premier niveau, par exemple?
Piotr Kula
2
Cette expression régulière semble échouer pour toute adresse e-mail contenant des caractères étrangers ou de nombreux caractères non standard.
EricP
2
Valider les adresses e-mail avec regex est généralement une mauvaise idée ... mais si vous devez le faire, il y a une excellente référence ici .. regular-expressions.info/email.html
Molomby
9
Cette expression régulière et ce site Web sont erronés. Il y a plein de nouveaux TLD de plus de 6 caractères. Ne suivez pas celui-ci.
jsgoupil
14

si vous n'utilisez pas encore .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";
    }
}

Ensuite, vous pouvez faire ceci:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }
mcfea
la source
1
J'aime le constructeur statique.
Brian Sweeney
1
@BrianSweeney, je ne peux pas m'en attribuer le mérite: P. Encore une autre information que j'ai reçue d'ici il y a des années.
mcfea
10

J'utilise MVC 3. Un exemple de propriété d'adresse e-mail dans l'une de mes classes est:

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

Supprimez le Requiredsi l'entrée est facultative. Pas besoin d'expressions régulières bien que j'en ai une qui couvre toutes les options d'une adresse e-mail jusqu'au niveau RFC 2822 (c'est très long).

Peter Smith
la source
3
Dans quel espace de noms se trouve votre attribut Email? Ou est-ce un attribut personnalisé?
Utilisateur
5
MVC 4 utilise [EmailAddress]et vous devez avoirusing System.ComponentModel.DataAnnotations;
Piotr Kula
1
Il semblerait que peu importe ce que je fais, l'utilisation de l'un Emailou l' autre RegularExpressionrend le champ obligatoire. La suppression de l' Requiredannotation n'a aucun effet. Des suggestions sur la marche à suivre pour que les champs avec RegularExpressionvalidation acceptent les champs vides?
Eric K
@QuantumDynamix Essayez d'ajouter un test de chaîne vide à votre expression régulière en option. Jamais essayé, mais qui sait?
Peter Smith
7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }
Kuganrajh Rajendran
la source
4

J'ai utilisé le code ci-dessus dans le projet MVC5 et cela fonctionne parfaitement avec l'erreur de validation.Il suffit d'essayer ce code

   [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
la source
1
Bienvenue dans StackOverflow. Les réponses basées uniquement sur le code ne sont pas considérées comme une bonne pratique. Veuillez expliquer ce que cela fait et comment cela résout le problème.
quinz
0

Les scripts sont généralement chargés à la fin de la page html, et MVC recommande l'utilisation de bundles, en disant simplement. Donc, mon meilleur pari est que vos jquery.validatefichiers ont été modifiés d'une manière ou d'une autre ou ne sont pas mis à jour vers la dernière version, car ils valident les entrées de courrier électronique.

Vous pouvez donc mettre à jour / actualiser votre paquet nuget ou écrire votre propre fonction, vraiment.

Voici un exemple que vous ajouteriez dans un fichier supplémentaire après 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"
);

Ceci est juste un copier-coller du jquery.validateRegex actuel , mais de cette façon, vous pouvez définir votre message d'erreur personnalisé / ajouter des méthodes supplémentaires aux champs que vous voudrez peut-être valider dans un proche avenir.

Tiramonium
la source
0

Comme indiqué ci-dessus, cela corrigera la validation côté serveur d'une adresse e-mail:

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

Toutefois...

Si vous utilisez la validation côté client JQuery, vous devez savoir que l'e-mail valide différemment du côté serveur (validation du modèle) au côté client (validation JQuery). Dans ce test @ example (une adresse e-mail de domaine de premier niveau) échouerait côté serveur mais validerait bien du côté client.

Pour corriger cette disparité, vous pouvez remplacer la validation par e-mail côté client par défaut comme suit:

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