2016-10-01 16 views
8

ApplicationUser için bir form kayıt defterinde çalışıyorum. Orada Facebook gibi bir alan var Email or phone. Model doğrulama için DataAnnotation kullanıyorum. Data annotation'da, e-posta doğrulaması için [EmailAddress] ve telefon numarası doğrulaması için [Phone] alırım. Ama ben [EmailAddressOrPhone] gibi bir şeye ihtiyacım var. Peki bunu nasıl başarabilirim?ASP.NET MVC Veri ek açıklama doğrulayıcısı e-posta veya telefon için

public class RegisterViewModel 
{ 
    ..... 

    [Required] 
    [Display(Name = "Email or Phone")] 
    public string EmailOrPhone { get; set; } 

    ...... 
} 

cevap

2

Sen Regex kullanarak bunu başarabilirsiniz. 'u e-posta ve telefon için bir arada kullanmanız gerekir.

public class RegisterViewModel 
{ 
    [Required] 
    [Display(Name = "Email or Phone")] 
    /* /<email-pattern>|<phone-pattern>/ */ 
    [RegularExpression(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$|^\+?\d{0,2}\-?\d{4,5}\-?\d{5,6}", ErrorMessage = "Please enter a valid email address or phone number")]  
    public string EmailOrPhone { get; set; } 
} 

Veya özel bir özellik

public class EmailOrPhoneAttribute : RegularExpressionAttribute 
{ 
    public EmailOrPhoneAttribute() 
     : base(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$|^\+?\d{0,2}\-?\d{4,5}\-?\d{5,6}") 
    { 
     ErrorMessage = "Please provide a valid email address or phone number"; 
    } 
} 

oluşturmak ve özel ek olarak

public class RegisterViewModel 
{ 
    [Required] 
    [Display(Name = "Email or Phone")] 
    [EmailOrPhone]  
    public string EmailOrPhone { get; set; } 
} 
+0

teşekkürler. Bu benim için iyi çalışıyor. – Zubayer

+0

Web sitenize, 'BŌb @ bob.com' gibi mükemmel bir e-posta adresiyle kaydolmak istemediğim sürece gayet iyi çalışıyor. O zaman işe yaramıyor. – Luke

+0

evet. Haklısın. Bu durumda 'Regex''i güncellemek sorunu çözecektir. Herhangi biri, "System.ComponentModel.DataAnnotations" ın [kaynak] 'dan kullandığı regex'i kullanabilir (https://github.com/Microsoft/referencesource/blob/master/System.ComponentModel.DataAnnotations/DataAnnotations/EmailAddressAttribute.cs). Ben sadece 'e-posta adresimi doğrulamak için bir regex kullanmamalıyım 'demeyi istedim ürpertici geliyor. –

1

, bu kütüphaneye bir göz atabilirsiniz öznitelikleri kullanabilirsiniz: https://github.com/jwaliszko/ExpressiveAnnotations

Örnek:

[Required] 
[AssertThat("IsEmail(EmailOrPhone) || (Length(EmailOrPhone) > 8 && Length(EmailOrPhone) < 16 && IsRegexMatch(EmailOrPhone, '^\\d+$'))", 
    ErrorMessageResourceType = typeof (Resources), ErrorMessageResourceName = nameof(Resources.EmailFormatInvalid))] 
[Display(Name = "EmailOrPhone")] 
public string EmailOrPhone { get; set; } 

Burada ExpressiveAnnotations öğesinden AssertThat özniteliğini kullandım ve bir Kaynak dosyasında EmailFormatInvalid hata mesajı oluşturdum.

+0

Bu bağlantı soruyu yanıtlayabilirken, temel parçaların dahil edilmesi daha iyidir. Buradaki cevabı ve referans için bağlantıyı sağlayın. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir. - [Yorum yazıla] (/ review/düşük kaliteli yazılar/13856254) – zinking

+0

Cevabı içerecek şekilde cevabı güncelledim. Bunun için üzgünüm, ben SO cevapları – peval27

3

Size shouldn't use your own regex to validate email addresses, ancak ben şahsen geçerli bir e-posta adresi olup olmadığını belirlemek için aşağıdaki mantığı kullanıyorum. Geçerli bir e-posta adresi değilse, bunun bir telefon numarası olduğunu varsayabilirsiniz.

Aşağıdaki kod, daha önce bahsettiğiniz ancak kodun içinde yer alan [EmailAddress] özniteliğini kullanır. Bu şekilde e-posta adresini doğrulama yolunuzu bulmanız gerekmez.

public EmailOrPhoneAttribute : ValidationAttribute 
{ 
    public override IsValid(object value) 
    { 
     var emailOrPhone = value as string; 

     // Is this a valid email address? 
     if (this.IsValidEmailAddress(emailOrPhone)) 
     { 
      // Is valid email address 
      return true; 
     } 
     else if (this.IsValidPhoneNumber(emailOrPhone)) 
     { 
      // Assume phone number 
      return true; 
     } 

     // Not valid email address or phone 
     return false; 
    } 

    private bool IsValidEmailAddress(string emailToValidate) 
    { 
     // Get instance of MVC email validation attribute 
     var emailAttribute = new EmailAddressAttribute(); 

     return emailAttribute.IsValid(emailOrPhone); 
    } 

    private bool IsValidPhoneNumber(string phoneNumberToValidate) 
    { 
     // Regualr expression from https://stackoverflow.com/a/8909045/894792 for phone numbers 
     var regex = new Regex("^\+?(\d[\d-. ]+)?(\([\d-. ]+\))?[\d-. ]+\d$"); 
     return regex.IsMatch(phoneNumberToValidate) 
    } 
} 

Doğal olarak telefon numarası kendinizi düzeltin ise telefon numaraları farklı ülkelerde farklı olduğu için size belirlemek için gidiyoruz nasıl belirlemek gerekir. Örnek olarak this question'dan düzenli bir ifade aldım.

+0

bir acemi yaşıyorum Ben yeni Regex (@ "^ \ +?(\ d [\ d-.] +)? (\ ([\ d-.] + \))? [\ d-. ] + \ d $ ") –

+0

ama' [EmailAddress] 'özniteliği de 'regex' başlık altında ve e-posta doğrulama için kullanılır 'regex' [http://emailregex.com]% 99.99 durum için çalışır diyor. –

+0

ama bunu sürdürmek zorunda değilsiniz, bu çerçevenin bir parçası. – Luke

İlgili konular