EmailAddressAttribute将法国电子邮件地址错误地分类为无效

问题描述:

我在模型上使用EmailAddressAttributeEmailAddressAttribute将法国电子邮件地址错误地分类为无效

问题是,当我使用的

ó[email protected] 

它说,这是无效的(非常有效)的e-mail地址。

型号:

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> 

我还提取从客户端验证正则表达式,下面一行返回false

/^[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'使用以下正则表达式来验证值:[source](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://*.com/questions/12180753/regularexpressionvalidator-control-not-allowing-emails-with-french-characters-f –

你需要设置在jQuery验证插件电子邮件验证定制的正则表达式:

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

jQuery验证插件使用一个有效的电子邮件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。请查看Wikipedia上的Email address page了解更多信息和支持细节。

+0

我跟这个一起使用了'EmailAddressAttribute'在服务器上使用的正则表达式,所以我可以肯定client + server会同意的。另外,我开始了一个错误[在项目上](https://github.com/jquery-validation/jquery-validation/issues/1949),所以至少有关人员都知道。这个答案的优雅,这意味着我可以将代码包含在一个新的.js文件旁边,这就是为什么我已经授予这个奖励。非常感谢@Leonid Vesilyev,继续保持。 –

我不知道你如何验证电子邮件地址,我试图验证你的电子邮件像一个字符串,我的变量isValid已验证与真实。

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

希望这些是有用的。

+1

不是一个真正的答案... –

+0

@MarcelN:这是一个有效的非重复声明,在问题被延长之前。 –

正如你可以在正则表达式看:

/^[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 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-])?)*$/ 

而且你还可以科瑞一个自定义属性为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

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

语境的问题是要确定正确的答案非常重要。在大多数情况下,最好是坚持使用简单的解决方案:

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

此正则表达式将运行匹配一些无效的电子邮件地址的风险,但将执行的总体结构。理想情况下,您可以通过电子邮件确认框或确认电子邮件执行第二轮验证,但即使没有额外的验证,也应该能够捕获大多数无意无效的条目。