2016-10-01 85 views
8

我正在爲ApplicationUser進行表單註冊。在那裏,我有一個像Facebook這樣的字段Email or phone。我正在使用DataAnnotation進行模型驗證。在Data annotation中,我獲得[EmailAddress]用於電子郵件驗證,[Phone]用於電話號碼驗證。但我需要類似[EmailAddressOrPhone]那麼我該如何實現呢?用於電子郵件或電話的ASP.NET MVC數據註釋驗證程序

public class RegisterViewModel 
{ 
    ..... 

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

    ...... 
} 

回答

2

您可以使用Regex來實現此目的。你必須結合電子郵件和電話的正則表達式在一起。

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

,或者可以創建一個自定義屬性

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

,並使用該

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

謝謝。這對我來說很好。 – Zubayer

+0

它工作正常,除非我想用一個完全有效的電子郵件地址如'BŌ[email protected] bob.com'註冊您的網站。然後它不起作用。 – Luke

+0

是的。你是對的。在這種情況下更新'Regex'將解決這個問題。任何一個都可以使用正則表達式的是'System.ComponentModel.DataAnnotations'從[源]使用(https://github.com/Microsoft/referencesource/blob/master/System.ComponentModel.DataAnnotations/DataAnnotations/EmailAddressAttribute.cs)。我只是想''不應該使用正則表達式來驗證電子郵件地址'聽起來令人毛骨悚然。 –

1

除了自定義屬性,你可以看看這個庫: https://github.com/jwaliszko/ExpressiveAnnotations

一個例子是:

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

其中我使用了ExpressiveAnnotations的AssertThat屬性,並在資源文件中創建了錯誤消息EmailFormatInvalid。

+0

儘管此鏈接可能會回答該問題,但最好包含以下主要部分:這裏的答案和提供的鏈接供參考。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/13856254) – zinking

+0

我已經更新了包含代碼的答案。對不起,我是一個新手在SO答案 – peval27

3

shouldn't use your own regex to validate email addresses,但是我個人會使用以下邏輯來確定它是否是一個有效的電子郵件地址。如果它不是一個有效的電子郵件地址,您可以認爲它是一個電話號碼。

下面的代碼使用你已經提到的[EmailAddress]屬性,但代碼中。這樣你就不必發明自己的驗證電子郵件地址的方式。

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

當然,你需要確定你將如何確定電話號碼是正確的自己,因爲電話號碼是在不同的國家不同。作爲一個例子,我剛剛從this question獲得了一個正則表達式。

+0

我想你的意思是'新的正則表達式(@「^ \ +?(\ d [\ d-。] +)?(\([\ d-。] + \))?[\ d-。 ] + \ d $「)' –

+0

但'[EmailAddress]'屬性也使用'regex'作爲引擎蓋和電子郵件驗證'regex' [http://emailregex.com]表示它適用於99.99%的情況 –

+0

是,但你不必維護它,它是框架的一部分。 – Luke

相關問題