ASP.NET MVC veri türü özniteliklerini kullanarak e-posta adresi doğrulaması


163

Bir E-postanın doğrulanmasıyla ilgili bazı sorunlarım var.

Modelimde:

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

Bana göre:

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

Şimdi alanı boş bıraktığınızda bana doğru "Alan boş olamaz" gösteriyor. Ancak, "fwenrjfw" gibi geçersiz bir e-posta adresi doldurduğunuzda, form "E-posta geçerli değil" demez.

Girişi e-posta adresi olarak doğrulamak için formu nasıl alabilirim? Bu konuda yardım istiyorum.

Yanıtlar:


328

.NET Framework 4.5 kullanıyorsanız, çözüm EmailAddressAttributeiçeride bulunan kullanmaktır System.ComponentModel.DataAnnotations.

Kodunuz şuna benzer olmalıdır:

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

Teşekkürler @Shittu Olugbenga! Ama bunun neden işe yaramadığını anlayamıyorum:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli

15
@Wellington Zanelli - DataType (DataType.EmailAddress) kullanıcı girişini doğrulamak için kullanılamaz. Yalnızca görüntüleme / düzenleyici şablonlarını kullanarak değerlerin oluşturulması için bir UI ipucu sağlamak için kullanılır.
Liam

3
@Jni DataType.EmailAddressdoğrulama ile ilgili değil. Veri sunumu hakkında ...
Sebastian Xawery Wiśniowiecki

3
Aynı sorun var ve benim için e-posta doğrulama 'isim @ xxx' gibi e-postalar dışında iyi çalışıyor. Bunu gören başka biri var mı?
Kremena Lalova

3
@KremenaLalova name@xxxtamamen geçerli bir e-posta adresidir, bu nedenle bu yöntemde yanlış bir şey yoktur. Örneğin örneği ele username@localhostalalım.
John Bergman

39

Html.EditorForBunun yerine yardımcı yöntemi deneyin Html.TextBoxFor.


1
Bu doğru yanıttır, çünkü modelinize önceden eklediğiniz veri türünü ve hatasını kullanacaktır.
Ricardo Sanchez

4
Bu yöntem alan adı tld olup olmadığını kontrol etmez, bu yüzden birisi myname @ whatever koymak ve .com dışında bırakabilir ve doğru bir şekilde doğrulayacaktır
JasonH

8
myname @ whatever geçerli bir e-posta adresi
michaelmsm89

Mvc 4 için mükemmel çalıştı. Teşekkür ederim.
Jose Gomez

E-posta doğrulamak için html.Editor içine ne yazılır?
Neeraj Kumar

28

RegularExpression Attribute, aşağıdaki gibi bir şey kullanmanız gerekir:

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

Ve [Zorunlu] ifadesini silmeyin çünkü [RegularExpression] boş alanları etkilemez.


8
Eski skool güzel ama Microsoft bir öznitelik uyguladığından, belirli durumlarda, ülkelerde, saat dilimlerinde veya gezegenlerde meydana gelebilecek hataları ve gözetimleri ele alıyor. Özel regex'ten tamamen serbest bırakılmış bir kod tabanı kullanmak en iyisidir. Normal ifadeniz, yeni üst düzey alanları dikkate alıyor mu?
Piotr Kula

2
Bu normal ifade, yabancı karakterler veya standart olmayan birçok karakter içeren herhangi bir e-posta adresi için başarısız olacak gibi görünüyor.
EricP

2
Regex ile e-posta adreslerini doğrulama genellikle kötü bir fikir ... ama Gerekirse, mükemmel bir referans .. Burada var regular-expressions.info/email.html
Molomby

9
Bu normal ifade ve web sitesi yanlış. 6 karakterden fazla yeni TLD var. Bunu takip etme.
jsgoupil

14

Henüz .net 4.5 kullanmıyorsanız:

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

Sonra bunu yapabilirsiniz:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }

1
Statik yapıcıyı seviyorum.
Brian Sweeney

1
@BrianSweeney, bunun için kredi alamıyorum: P. Yıllar önce buradan aldığım başka bir kibrit.
mcfea

10

MVC 3 kullanıyorum. Sınıflarımdan birinde e-posta adresi özelliği örneği:

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

RequiredGiriş isteğe bağlıysa çıkarın . RFC 2822 seviyesine kadar bir e-posta adresindeki tüm seçenekleri kapsayan bir tane olmasına rağmen düzenli ifadelere gerek yok (çok uzun).


3
E-posta özelliğiniz hangi ad alanındadır? Yoksa özel bir özellik mi?
Kullanıcı

5
MVC 4 kullanır [EmailAddress]ve sahip olmanız gerekirusing System.ComponentModel.DataAnnotations;
Piotr Kula

1
Ne yaparsam yapayım, ya alanın kullanılması ya Emailda RegularExpressionalanın zorunlu kılınması gibi görünüyor . RequiredEk açıklamanın kaldırılmasının bir etkisi yoktur. RegularExpressionDoğrulamalı alanların boş alanları kabul etmesi için ne yapılacağına dair herhangi bir öneriniz var mı?
Eric K

@QuantumDynamix Normal ifadenize seçenek olarak boş bir dize testi eklemeyi deneyin. Hiç denemedim, ama kim bilir?
Peter Smith

7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }

4

MVC5 projesinde yukarıdaki kodu kullandı ve doğrulama hatası ile tamamen iyi çalışıyor.

   [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; }

1
StackOverflow'a hoş geldiniz. Yalnızca kod yanıtları iyi bir uygulama olarak değerlendirilmez. Lütfen bunun ne yaptığını ve sorunu nasıl çözdüğünü açıklayın.
quinz

0

Komut dosyaları genellikle html sayfasının sonuna yüklenir ve MVC demetleri kullanmayı önerir. Benim en iyi bahisimjquery.validate dosyalarınızın bir şekilde değiştirilmiş olması veya e-posta girişlerini doğruladıkları için en son sürüme güncellenmemeleri.

Böylece nuget paketinizi güncelleyebilir / yenileyebilir veya kendi fonksiyonunuzu yazabilirsiniz.

Aşağıda, fazladan bir dosyaya ekleyeceğiniz bir örnek verilmiştir 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"
);

Bu sadece mevcut jquery.validateRegex'in bir kopyası ve yapıştırmasıdır , ancak bu şekilde özel hata mesajınızı ayarlayabilir / yakın gelecekte doğrulamak isteyebileceğiniz alanlara ekstra yöntemler ekleyebilirsiniz.


0

Yukarıdakilere göre bu, bir E-posta Adresinin sunucu tarafı doğrulamasını düzeltir:

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

Ancak...

JQuery istemci tarafı doğrulaması kullanıyorsanız, E-postanın sunucu tarafını (model doğrulaması) istemci tarafına (JQuery doğrulaması) farklı şekilde doğruladığını bilmelisiniz. Bu test @ örneğinde (bir üst düzey alan e-posta adresi) sunucu tarafında başarısız olur, ancak istemci tarafında para cezası doğrulanır.

Bu eşitsizliği gidermek için varsayılan istemci tarafı e-posta doğrulamasını aşağıdaki gibi geçersiz kılabilirsiniz:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.