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 в файле ресурсов.