ASP.NET 用于电子邮件或 phone 的 MVC 数据注释验证器
ASP.NET MVC Data annotation validator for email or phone
我正在处理 ApplicationUser
的表格注册。在那里,我有一个像 Facebook 这样的字段 Email or phone
。我正在使用 DataAnnotation
进行模型验证。在 Data annotation
中,我得到 [EmailAddress]
用于电子邮件验证,[Phone]
用于 phone 号码验证。但我需要像 [EmailAddressOrPhone]
这样的东西。 那么我该如何实现呢?
public class RegisterViewModel
{
.....
[Required]
[Display(Name = "Email or Phone")]
public string EmailOrPhone { get; set; }
......
}
您可以使用 Regex
实现此目的。您必须 将电子邮件的正则表达式 与 phone 组合在一起。
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; }
}
除了自定义属性,你还可以看看这个库:
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。
您 shouldn't use your own regex to validate email addresses,但我个人会使用以下逻辑来确定它是否是有效的电子邮件地址。如果它不是有效的电子邮件地址,您可以假设它是一个 phone 号码。
以下代码使用了您已经提到但在代码中的 [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 for phone numbers
var regex = new Regex("^\+?(\d[\d-. ]+)?(\([\d-. ]+\))?[\d-. ]+\d$");
return regex.IsMatch(phoneNumberToValidate)
}
}
当然,您需要自己确定如何确定 phone 数字是否正确,因为 phone 数字在不同国家/地区是不同的。我刚刚以 this question 中的正则表达式为例。
我正在处理 ApplicationUser
的表格注册。在那里,我有一个像 Facebook 这样的字段 Email or phone
。我正在使用 DataAnnotation
进行模型验证。在 Data annotation
中,我得到 [EmailAddress]
用于电子邮件验证,[Phone]
用于 phone 号码验证。但我需要像 [EmailAddressOrPhone]
这样的东西。 那么我该如何实现呢?
public class RegisterViewModel
{
.....
[Required]
[Display(Name = "Email or Phone")]
public string EmailOrPhone { get; set; }
......
}
您可以使用 Regex
实现此目的。您必须 将电子邮件的正则表达式 与 phone 组合在一起。
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; }
}
除了自定义属性,你还可以看看这个库: 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。
您 shouldn't use your own regex to validate email addresses,但我个人会使用以下逻辑来确定它是否是有效的电子邮件地址。如果它不是有效的电子邮件地址,您可以假设它是一个 phone 号码。
以下代码使用了您已经提到但在代码中的 [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 for phone numbers
var regex = new Regex("^\+?(\d[\d-. ]+)?(\([\d-. ]+\))?[\d-. ]+\d$");
return regex.IsMatch(phoneNumberToValidate)
}
}
当然,您需要自己确定如何确定 phone 数字是否正确,因为 phone 数字在不同国家/地区是不同的。我刚刚以 this question 中的正则表达式为例。