ASP.用于电子邮件或电话的.NET MVC数据注释验证器

本文关键字:数据 MVC 注释 验证 NET 用于 电子邮件 电话 ASP | 更新日期: 2023-09-27 18:09:44

我正在为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; }
    ......
}

ASP.用于电子邮件或电话的.NET MVC数据注释验证器

您不应该使用自己的正则表达式来验证电子邮件地址,但是我个人会使用以下逻辑来确定它是否是有效的电子邮件地址。如果它不是一个有效的电子邮件地址,你可以假设它是一个电话号码。

下面的代码使用了您已经提到的[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)
    }
}

当然,你需要自己决定如何判断电话号码是否正确,因为不同国家的电话号码是不同的。我刚刚从这个问题中取了一个正则表达式作为例子。

您可以使用Regex来实现这一点。您必须的email和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; }

我已经使用AssertThat属性从ExpressiveAnnotations和创建一个错误消息EmailFormatInvalid在资源文件