ASP.NET валидатор аннотаций данных MVC для электронной почты или телефона

Я работаю над регистрацией формы для ApplicationUser. Вот, у меня есть поле Email or phone как Facebook. Я использую DataAnnotation для проверки модели. В Data annotation Я [EmailAddress] для проверки электронной почты и [Phone] для проверки номера телефона. Но мне нужно что-то вроде [EmailAddressOrPhone]. Итак, как я могу этого достичь?

public class RegisterViewModel
{
    .....

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

    ......
}

3 ответов


вы можете добиться этого, используя 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; }
 }

вы не следует использовать собственное регулярное выражение для проверки адресов электронной почты, однако я лично буду использовать следующую логику, чтобы определить, является ли это действительным адресом электронной почты. Если это не действительный адрес электронной почты, можно предположить, что это номер телефона.

следующий код использует [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)
    }
}

естественно, вы вам нужно будет определить, как вы собираетесь определить, правильный ли номер телефона, потому что номера телефонов в разных странах разные. Я только что взял регулярное выражение из этот вопрос в качестве примера.


в дополнение к пользовательским атрибутам вы можете посмотреть эту библиотеку: 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; }

где я использовал assertthat атрибут из ExpressiveAnnotations и создал сообщение об ошибке EmailFormatInvalid в файле ресурсов.