Überprüfung der E-Mail-Adresse mithilfe von ASP.NET MVC-Datentypattributen

163

Ich habe einige Probleme mit der Validierung einer E-Mail.

In meinem Modell:

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

Aus meiner Sicht:

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

Jetzt wird mir korrekt "Feld kann nicht leer sein" angezeigt, wenn Sie das Feld leer lassen. Wenn Sie jedoch eine ungültige E-Mail-Adresse wie "fwenrjfw" eingeben, wird auf dem Formular nicht "E-Mail ist ungültig" angezeigt.

Wie kann ich das Formular erhalten, um die Eingabe als E-Mail-Adresse zu bestätigen? Ich suche Hilfe dabei.

Java Afca
quelle

Antworten:

327

Wenn Sie .NET Framework 4.5 verwenden, müssen Sie die Lösung verwenden, EmailAddressAttributedie sich im Inneren befindet System.ComponentModel.DataAnnotations.

Ihr Code sollte ungefähr so ​​aussehen:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
Shittu Joseph Olugbenga
quelle
Vielen Dank an Shittu Olugbenga! Aber ich kann nicht verstehen, warum das nicht funktioniert:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli
15
@Wellington Zanelli - Der Datentyp (DataType.EmailAddress) kann nicht zur Überprüfung von Benutzereingaben verwendet werden. Es wird nur verwendet, um einen UI-Hinweis zum Rendern der Werte mithilfe der Anzeige- / Editorvorlagen bereitzustellen.
Liam
3
Bei @Jni DataType.EmailAddressgeht es nicht um Validierung. Es geht um Datenpräsentation ...
Sebastian Xawery Wiśniowiecki
3
Ich habe das gleiche Problem und für mich funktioniert die E-Mail-Validierung einwandfrei, mit Ausnahme von E-Mails wie 'name @ xxx'. Hat das noch jemand gesehen?
Kremena Lalova
3
@KremenaLalova name@xxxist eine vollständig gültige E-Mail-Adresse, daher ist an dieser Methode nichts auszusetzen. Betrachten Sie zum Beispiel das username@localhostBeispiel.
John Bergman
39

Versuchen Sie Html.EditorForstattdessen die Hilfsmethode Html.TextBoxFor.

Hazimdikenli
quelle
1
Dies ist die richtige Antwort, da der Datentyp und der Fehler verwendet werden, die Sie bereits in Ihrem Modell hinzugefügt haben.
Ricardo Sanchez
4
Diese Methode sucht nicht nach Domain tld, also könnte jemand myname @ Whatever eingeben und .com
weglassen
8
myname @ was auch immer eine gültige E-Mail-Adresse ist
michaelmsm89
Funktionierte perfekt für mvc 4. Danke.
Jose Gomez
Was muss in html.Editor geschrieben werden, um E-Mails zu validieren?
Neeraj Kumar
28

Sie müssen das RegularExpression-Attribut verwenden, ungefähr so:

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

Und löschen Sie nicht [Erforderlich], da [RegularExpression] keine Auswirkungen auf leere Felder hat.

Alexander Imra
quelle
8
Die alte Schule ist nett, aber da Microsoft ein Attribut implementiert hat, werden Fehler und Versehen behoben, die in bestimmten Situationen, Ländern, Zeitzonen oder Planeten auftreten können. Daher ist es am besten, eine vollständig freigegebene Codebasis als benutzerdefinierten regulären Ausdruck zu verwenden. Berücksichtigt Ihre Regex beispielsweise die neuen Top-Level-Domains?
Piotr Kula
2
Dieser reguläre Ausdruck scheint für jede E-Mail-Adresse mit Fremdzeichen oder vielen nicht standardmäßigen Zeichen fehlzuschlagen.
EricP
2
Das Validieren von E-Mail-Adressen mit Regex ist normalerweise eine schreckliche Idee ... aber wenn Sie müssen, gibt es hier eine ausgezeichnete Referenz. Regular-expressions.info/email.html
Molomby
9
Diese Regex und Website ist falsch. Es gibt viele neue TLDs mit mehr als 6 Zeichen. Folge diesem nicht.
Jsgoupil
14

Wenn Sie .net 4.5 noch nicht verwenden:

/// <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";
    }
}

Dann können Sie dies tun:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }
mcfea
quelle
1
Ich mag den statischen Konstruktor.
Brian Sweeney
1
@BrianSweeney, ich kann es nicht gutschreiben: P. Noch ein Leckerbissen, das ich vor Jahren von hier bekommen habe.
McFea
10

Ich verwende MVC 3. Ein Beispiel für die Eigenschaft einer E-Mail-Adresse in einer meiner Klassen ist:

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

Entfernen Sie das, Requiredwenn die Eingabe optional ist. Keine Notwendigkeit für reguläre Ausdrücke, obwohl ich einen habe, der alle Optionen innerhalb einer E-Mail-Adresse bis zur RFC 2822-Ebene abdeckt (es ist sehr lang).

Peter Smith
quelle
3
In welchem ​​Namespace befindet sich Ihr E-Mail-Attribut? Oder ist es ein benutzerdefiniertes Attribut?
Benutzer
5
MVC 4 verwendet [EmailAddress]und Sie müssen habenusing System.ComponentModel.DataAnnotations;
Piotr Kula
1
Es scheint, dass egal was ich tue, die Verwendung von entweder Emailoder RegularExpressionmacht das Feld erforderlich. Das Entfernen der RequiredAnmerkung hat keine Auswirkung. Irgendwelche Vorschläge, was zu tun ist, damit Felder mit RegularExpressionValidierung leere Felder akzeptieren?
Eric K
@QuantumDynamix Versuchen Sie, Ihrem regulären Ausdruck optional einen leeren Zeichenfolgentest hinzuzufügen. Ich habe es nie versucht, aber wer weiß?
Peter Smith
7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }
Kuganrajh Rajendran
quelle
4

Verwendet den obigen Code in MVC5-Projekt und es funktioniert völlig gut mit dem Validierungsfehler. Versuchen Sie einfach diesen 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
quelle
1
Willkommen bei StackOverflow. Nur-Code-Antworten werden nicht als bewährte Methode angesehen. Bitte erläutern Sie, was dies bewirkt und wie das Problem behoben wird.
Quinz
0

Skripte werden normalerweise am Ende der HTML-Seite geladen, und MVC empfiehlt die Verwendung von Bundles. Meine beste Wette ist also, dass Ihre jquery.validateDateien auf irgendeine Weise geändert wurden oder nicht auf die neueste Version aktualisiert wurden, da sie E-Mail-Eingaben validieren.

Sie können also entweder Ihr Nuget-Paket aktualisieren / aktualisieren oder Ihre eigene Funktion schreiben.

Hier ist ein Beispiel, das Sie nachher in eine zusätzliche Datei einfügen würden 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"
);

Dies ist nur ein Kopieren und Einfügen des aktuellen jquery.validateRegex. Auf diese Weise können Sie Ihre benutzerdefinierte Fehlermeldung festlegen / zusätzliche Methoden zu Feldern hinzufügen, die Sie möglicherweise in naher Zukunft überprüfen möchten.

Tiramonium
quelle
0

Auf diese Weise wird die serverseitige Überprüfung einer E-Mail-Adresse behoben:

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

Jedoch...

Wenn Sie die clientseitige JQuery-Validierung verwenden, sollten Sie wissen, dass die E-Mail die serverseitige (Modellvalidierung) anders als die clientseitige (JQuery-Validierung) validiert. In diesem Test @ -Beispiel (eine Domain-E-Mail-Adresse der obersten Ebene) würde die Serverseite fehlschlagen, aber auf der Clientseite einwandfrei validiert.

Um diese Ungleichheit zu beheben, können Sie die standardmäßige clientseitige E-Mail-Validierung wie folgt überschreiben:

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