RegexValidator для проверки электронной почты, делая стандартный атрибут - PullRequest
3 голосов
/ 24 марта 2010

Я хотел бы проверить электронную почту с помощью RegexValidator, например,

[RegexValidator(@"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$")]

Что отлично работает, теперь я хочу обернуть атрибут, чтобы сохранить его в одном месте:

public class EmailAttribute : RegexValidator 
{
    public EmailAttribute()
        : base(@"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$")
    {
    }
}

Так что я могу использовать

[EMail]

Но это не работает, почему?

1 Ответ

10 голосов
/ 24 марта 2010

Вы не должны проверять адреса электронной почты с помощью регулярных выражений.

Вместо этого используйте этот атрибут:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public sealed class EmailAddressAttribute : DataTypeAttribute {
    public EmailAddressAttribute() : base(DataType.EmailAddress) { ErrorMessage = "Please enter a valid email address"; }

    public override bool IsValid(object value) {
        if (value == null) return true;
        MailAddress address;
        try {
            address = new MailAddress(value.ToString());
        } catch (FormatException) { return false; }
        return address.Host.IndexOf('.') > 0;    //Email address domain names do not need a ., but in practice, they do.
    }
}

Если требуется проверка на стороне клиента для ASP.Net MVC, используйте этот адаптер:

public class EmailAddressValidator : DataAnnotationsModelValidator<EmailAddressAttribute> {
    public EmailAddressValidator(ModelMetadata metadata, ControllerContext context, EmailAddressAttribute attribute) : base(metadata, context, attribute) { }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() {
        yield return new ModelClientValidationRegexRule(Attribute.ErrorMessage, 
                     @".+@.+\..+");    //Feel free to use a bigger regex
    }
}

И зарегистрируйте это так:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAddressAttribute), typeof(EmailAddressValidator));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...