12

Я использую EmailAddressAttribute для использования на моей модели.EmailAddressAttribute неверно классифицирует французский адрес электронной почты как недействительный

Проблема заключается в том, когда я использую (вполне допустимо) электронной почты

ó[email protected] 

он говорит, что является недопустимым.

Модель:

public class ForgotPasswordViewModel 
{ 
    [Required] 
    [EmailAddress] 
    [Display(Name = "Email")] 
    public string Email { get; set; } 

    public CmsContentPagesModel PageCmsContent { get; set; } 

    public CmsContentPagesModel PageCmsContentInfoIcon { get; set; } 
    public CmsContentPagesModel PageCmsContentRightPanel { get; set; } 
} 

Является ли это проблемой с атрибутом, или я как-то надо указать, что французские электронные письма в порядке?

Поле ввода оказанной:

<div class="col-md-5"> 
    <input class="form-control" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" type="text" value="" /> 
    <span class="field-validation-valid text-danger" data-valmsg-for="Email" data-valmsg-replace="true"></span> 
</div> 

Я также извлек регулярное выражение из проверки на стороне клиента, следующая строка возвращает ложное

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test('ó[email protected]'); 

, по-видимому соответствует с this standard даже несмотря на то, демо для этого точного code also fails.

+1

Функция EmailAddressAttribute использует следующее Regex для проверки значения: [источник] (https://referencesource.microsoft.com/#System.ComponentModel.DataAnnotations/DataAnnotations/EmailAddressAttribute.cs,54). Адрес электронной почты, который вы предоставляете, соответствует регулярному выражению, поэтому он должен быть действительным. Можете ли вы опубликовать модель C#? Кстати, недавно я написал сообщение в блоге об [подтверждении адреса электронной почты .NET] (https://www.softfluent.com/blog/dev/2017/02/06/Advanced-email-address-validation-in-NET) – meziantou

+0

@meziantou - Это хорошая новость, я добавил модель. –

+0

проверить эту тему: http://stackoverflow.com/questions/12180753/regularexpressionvalidator-control-not-allowing-emails-with-french-characters-f –

ответ

5

Вы должны установить пользовательский регулярное выражение для проверки электронной почты в JQuery Validation Plugin:

$.validator.methods.email = function(value, element) { 
    return this.optional(element) || /INSERT_YOUR_REGEX_HERE/.test(value); 
} 

JQuery Validation Плагин использует RFC 5322 Internet Message Protocol specification определения действительной электронной почты. Это определение запрещает использование нелатинских букв в локальной части. Соответствующий отрывок из проекта-х README.md:

ВАЖНО О ЭЛЕКТРОННОЙ ВАЛИДАЦИИ. Начиная с версии 1.12.0 этот плагин использует то же регулярное выражение, что и HTML5 specification suggests for browsers to use. Мы будем следовать их примеру и использовать ту же проверку. Если вы считаете, что спецификация неверна, , пожалуйста, сообщите о проблеме им. Если у вас разные требования, рассмотрите using a custom method. В случае, если вам необходимо настроить стандартные шаблоны выражения для проверки правильности выражения , пожалуйста, follow the documentation.

Интернационализация адреса электронной почты определяется другой спецификацией - RFC 6530 Overview and Framework for Internationalized Email. Он использует термин SMTPUTF8. Проверьте Email address page на Википедию для получения дополнительной информации и поддержки.

+0

Я пошел с этим и использовал регулярное выражение из используемого на сервере 'EmailAddressAttribute', поэтому я могу быть уверен, что клиент + сервер согласится. Кроме того, я начал работу с ошибкой [по проекту] (https://github.com/jquery-validation/jquery-validation/issues/1949), так что, по крайней мере, те, кого это касается, знают. Элегантность этого ответа, то есть я могу просто включить код в новый .js-файл вместе с оригиналом, поэтому я наградил эту награду. Большое спасибо @Leonid Vesilyev, продолжайте это. –

-4

Я не знаю, как вы проверяете адрес электронной почты, я пытался проверить вашу электронную почту как строку, а моя переменная isValid была проверена с помощью true.

EmailAddressAttribute testEmailAddress = new EmailAddressAttribute(); 
bool isValid = testEmailAddress.IsValid("ó[email protected]"); 

Надеюсь, что это полезно.

+1

Не совсем ответ ... –

+0

@MarcelN: Это действительное неповторимое заявление до того, как вопрос был расширен. –

2

Как вы можете видеть в регулярных выражениях:

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test('ó[email protected]'); 

ó персонаж не находится в диапазоне

вы можете использовать следующее регулярное выражение:

/^[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-][email protected][a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-](?:[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-]{0,61}[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-])?(?:\.[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-](?:[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-]{0,61}[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-])?)*$/ 

И вы можете также Creat пользовательский атрибут как FrenchEmailAddress, чтобы проверить свойство с помощью регулярного выражения, которое я опубликовал в пользовательском атрибуте

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
public class FrenchEmailAddressAttribute : ValidationAttribute 
{ 
    public string Pattern { get; set; } 
    public RegexOptions Options { get; set; } 

    public FrenchEmailAddressAttribute(string pattern, RegexOptions options = RegexOptions.None) 
    { 
     Pattern = pattern; 
     Options = options; 
    } 

    public override bool IsValid(object value) 
    { 
     return IsValid(value as string); 
    } 

    public bool IsValid(string value) 
    { 
     return string.IsNullOrEmpty(value) ? true : new Regex(Pattern, Options).IsMatch(value); 
    } 
} 
+0

Вам также придется менять другие диапазоны A-Z. –

+0

@HenkHolterman благодарит за это, я отредактировал свой ответ – Karamafrooz

-1

System.ComponentModel.DataAnnotations.EmailAddressAttribute класс с использованием этого регулярного выражения.

const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$"; 

и подтверждающей ваш адрес электронной почты, как сказал @ThomasRainero

1

Контекст проблемы очень важно для определения правильного ответа. В большинстве случаев, это лучше придерживаться простым решения:

^\[email protected]\S+\.\S+$ 

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