Sprawdzanie poprawności adresu e-mail przy użyciu atrybutów typu danych ASP.NET MVC

163

Mam problemy z weryfikacją wiadomości e-mail.

W moim modelu:

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

Według mnie:

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

Teraz poprawnie wyświetla mi „Pole nie może być puste”, gdy zostawisz to pole puste. Ale kiedy wypełnisz nieprawidłowy adres e-mail, taki jak: "fwenrjfw", formularz nie powie "E-mail jest nieprawidłowy".

Jak mogę otrzymać formularz potwierdzający wprowadzone dane jako adres e-mail? Szukam pomocy w tym.

Java Afca
źródło

Odpowiedzi:

328

Jeśli używasz .NET Framework 4.5, rozwiązaniem jest użycie tego, EmailAddressAttributeco znajduje się w środku System.ComponentModel.DataAnnotations.

Twój kod powinien wyglądać podobnie do tego:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
Shittu Joseph Olugbenga
źródło
Dziękuję @Shittu Olugbenga! Ale nie mogę zrozumieć, dlaczego to nie działa:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli
15
@Wellington Zanelli - DataType (DataType.EmailAddress) nie może służyć do sprawdzania poprawności danych wejściowych użytkownika. Służy jedynie jako wskazówka interfejsu użytkownika dotycząca renderowania wartości przy użyciu szablonów wyświetlania / edytora.
Liam
3
@Jni DataType.EmailAddressnie dotyczy walidacji. Chodzi o prezentację danych ...
Sebastian Xawery Wiśniowiecki
3
Mam ten sam problem i dla mnie sprawdzanie poprawności adresu e-mail działa dobrze, z wyjątkiem e-maili typu „imię @ xxx”. Czy ktoś jeszcze to widział?
Kremena Lalova
3
@KremenaLalova name@xxxto całkowicie poprawny adres e-mail, więc nie ma nic złego w tej metodzie. Rozważmy username@localhostprzykład.
John Bergman,
39

Spróbuj Html.EditorForpomocnika metody zamiast Html.TextBoxFor.

hazimdikenli
źródło
1
To jest poprawna odpowiedź, ponieważ użyje typu danych i błędu, który już dodałeś w swoim modelu.
Ricardo Sanchez
4
ta metoda nie sprawdza domeny tld, więc ktoś może wstawić
moje imię
8
myname @ cokolwiek jest prawidłowym adresem e-mail
michaelmsm89
Działało idealnie dla mvc 4. Dziękuję.
Jose Gomez
Co napisać w html.Editor, aby sprawdzić poprawność wiadomości?
Neeraj Kumar
28

Musisz użyć atrybutu RegularExpression, coś takiego:

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

I nie usuwaj [Wymagane], ponieważ [RegularExpression] nie wpływa na puste pola.

Alexander Imra
źródło
8
Old skool jest fajny, ale ponieważ Microsoft zaimplementował atrybut, usuwa błędy i przeoczenia, które mogą się zdarzyć w pewnych sytuacjach, krajach, strefach czasowych lub planetach. Dlatego najlepiej jest użyć w pełni wydanej bazy kodu niż niestandardowy regex. Czy Twoje wyrażenie regularne uwzględnia na przykład nowe domeny najwyższego poziomu?
Piotr Kula
2
Wygląda na to, że to wyrażenie regularne zakończy się niepowodzeniem w przypadku każdego adresu e-mail zawierającego obce znaki lub wiele niestandardowych znaków.
EricP
2
Sprawdzanie poprawności adresów e-mail za pomocą wyrażenia regularnego jest zwykle okropnym pomysłem ... ale jeśli musisz, jest tutaj doskonałe odniesienie ... regular-expressions.info/email.html
Molomby
9
To wyrażenie regularne i witryna są nieprawidłowe. Istnieje wiele nowych TLD więcej niż 6 znaków. Nie podążaj za tym.
jsgoupil
14

jeśli nie używasz jeszcze .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";
    }
}

Następnie możesz to zrobić:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }
mcfea
źródło
1
Podoba mi się konstruktor statyczny.
Brian Sweeney,
1
@BrianSweeney, nie mogę tego przypisać: P. Kolejna ciekawostka, którą dostałem stąd lata temu.
mcfea
10

Używam MVC 3. Przykładem właściwości adresu e-mail w jednej z moich zajęć jest:

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

Usuń, Requiredjeśli dane wejściowe są opcjonalne. Nie ma potrzeby używania wyrażeń regularnych, chociaż mam takie, które obejmuje wszystkie opcje w adresie e-mail do poziomu RFC 2822 (jest bardzo długi).

Peter Smith
źródło
3
W jakiej przestrzeni nazw znajduje się Twój atrybut Email? A może jest to atrybut niestandardowy?
Użytkownik
5
MVC 4 używa [EmailAddress]i trzeba miećusing System.ComponentModel.DataAnnotations;
Piotr Kula
1
Wydawałoby się, że bez względu na to, co robię, użycie jednego z nich Emaillub RegularExpressionsprawia, że ​​pole jest wymagane. Usunięcie Requiredadnotacji nie ma żadnego efektu. Jakieś sugestie, co zrobić, aby pola z RegularExpressionwalidacją akceptowały puste pola?
Eric K
@QuantumDynamix Spróbuj dodać test pustego ciągu do wyrażenia regularnego jako opcję. Nigdy tego nie próbowałem, ale kto wie?
Peter Smith
7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }
Kuganrajh Rajendran
źródło
4

Użyłem powyższego kodu w projekcie MVC5 i działa on całkowicie dobrze z błędem walidacji. Po prostu spróbuj tego kodu

   [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
źródło
1
Witamy w StackOverflow. Odpowiedzi zawierające tylko kod nie są uważane za dobrą praktykę. Opisz, co to robi i jak rozwiązuje problem.
quinz
0

Skrypty są zwykle ładowane na końcu strony html, a MVC zaleca używanie pakietów, mówiąc tylko. Więc najlepiej mogę założyć, że twoje jquery.validatepliki zostały w jakiś sposób zmienione lub nie zostały zaktualizowane do najnowszej wersji, ponieważ sprawdzają poprawność wprowadzanych wiadomości e-mail.

Możesz więc zaktualizować / odświeżyć pakiet nuget lub napisać własną funkcję, naprawdę.

Oto przykład, który można dodać w dodatkowym pliku po 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"
);

To jest tylko kopiowanie i wklejanie obecnego jquery.validateRegex, ale w ten sposób możesz ustawić swój niestandardowy komunikat o błędzie / dodać dodatkowe metody do pól, które możesz chcieć zweryfikować w najbliższej przyszłości.

Tiramonium
źródło
0

Zgodnie z powyższym naprawi to weryfikację adresu e-mail po stronie serwera:

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

Jednak...

Jeśli używasz walidacji po stronie klienta JQuery, powinieneś wiedzieć, że wiadomość e-mail waliduje inaczej po stronie serwera (walidacja modelu) i po stronie klienta (walidacja JQuery). W tym teście @ example (adres e-mail domeny najwyższego poziomu) nie powiodło się po stronie serwera, ale po stronie klienta zostałby sprawdzony poprawnie.

Aby naprawić tę rozbieżność, możesz zastąpić domyślną weryfikację adresu e-mail po stronie klienta w następujący sposób:

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