使用ASP.NET MVC数据类型属性的电子邮件地址验证


163

我在验证电子邮件时遇到一些问题。

在我的模型中:

[Required(ErrorMessage = "Field can't be empty")]
[DataType(DataType.EmailAddress, ErrorMessage = "E-mail is not valid")]
public string ReceiverMail { get; set; }

在我看来:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Html.TextBoxFor(m => m.ReceiverMail, new { @placeholder="E-mail"}) <br />
@Html.ValidationMessageFor(m => m.ReceiverMail)

现在,当您将字段留空时,它可以正确显示“字段不能为空”。但是,当您填写无效的电子邮件地址时,例如:“ fwenrjfw”,则该表格不会显示“电子邮件无效”。

如何获取表格以验证输入内容是否为电子邮件地址?我正在为此寻求帮助。

Answers:


327

如果您使用的是.NET Framework 4.5,则解决方案是使用EmailAddressAttribute驻留在内部System.ComponentModel.DataAnnotations

您的代码应类似于以下内容:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

谢谢@Shittu Olugbenga!但我不明白为什么这行不通:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
惠灵顿·扎内利

15
@Wellington Zanelli-无法使用DataType(DataType.EmailAddress)验证用户输入。它仅用于提供UI提示,以使用显示/编辑器模板呈现值。
利亚姆

3
@Jni DataType.EmailAddress与验证无关。这是关于数据表示的……
塞巴斯蒂安XaweryWiśniowiecki2015年

3
我遇到了同样的问题,对我来说,电子邮件验证正常工作,但“ name @ xxx”之类的电子邮件除外。其他人看到了吗?
Kremena Lalova

3
@KremenaLalova name@xxx是一个完全有效的电子邮件地址,因此该方法没有任何问题。例如考虑username@localhost示例。
约翰·伯格曼

39

尝试使用Html.EditorFor辅助方法而不是Html.TextBoxFor


1
这是正确的答案,因为它将使用您已在模型中添加的数据类型和错误。
里卡多·桑切斯

4
此方法不检查域名tld,因此有人可以输入myname @ whatever而忽略.com,它将正确验证
JasonH 2014年

8
myname @ whatever是有效的电子邮件地址
michaelmsm89

完美地适用于mvc4。谢谢。
2015年

在html.Editor内部写些什么来验证电子邮件?
Neeraj Kumar

28

您需要使用RegularExpression属性,如下所示:

[RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "E-mail is not valid")]

并且不要删除[Required],因为[RegularExpression]不会影响空字段。


8
老傻子很好,但是由于Microsoft实施了一个属性,它解决了在某些情况,国家,时区或星球中可能发生的错误和疏忽。因此,与自定义正则表达式相比,最好使用完全发布的代码库。例如,您的正则表达式是否考虑了新的顶级域名?
Piotr Kula 2013年

2
对于任何带有外来字符或许多非标准字符的电子邮件地址,该正则表达式似乎都将失败。
EricP 2014年

2
验证电子邮件地址与正则表达式通常是一个可怕的想法...但如果你一定要,有这里是一个很好的参考.. regular-expressions.info/email.html
Molomby

9
此正则表达式和网站是错误的。有许多超过6个字符的新TLD。不要跟随这个。
jsgoupil

14

如果您尚未使用.net 4.5:

/// <summary>
/// TODO: AFTER WE UPGRADE TO .NET 4.5 THIS WILL NO LONGER BE NECESSARY.
/// </summary>
public class EmailAnnotation : RegularExpressionAttribute
{
    static EmailAnnotation()
    {
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAnnotation), typeof(RegularExpressionAttributeAdapter));
    }

    /// <summary>
    /// from: http://stackoverflow.com/a/6893571/984463
    /// </summary>
    public EmailAnnotation()
        : base(@"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
            + "@"
            + @"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$") { }

    public override string FormatErrorMessage(string name)
    {
        return "E-mail is not valid";
    }
}

然后,您可以执行以下操作:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }

1
我喜欢静态构造函数。
Brian Sweeney

1
@BrianSweeney,我对此不以为然:P。几年前我从这里得到的另一个消息。
mcfea

10

我使用MVC3。在我的一个类中,电子邮件地址属性的示例是:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[Email(ErrorMessage = "The email address is not valid")]
public string Email { get; set; }

Required如果输入是可选的,请删除。尽管我有一个涵盖了RFC 2822级(很长)级别的电子邮件地址中的所有选项,但不需要正则表达式。


3
您的电子邮件属性位于哪个名称空间?还是自定义属性?
用户

5
MVC 4的使用[EmailAddress],您需要拥有using System.ComponentModel.DataAnnotations;
Piotr Kula 2013年

1
似乎无论我做什么,都可以使用 EmailRegularExpression使得所需要的领域。删除Required注释无效。关于如何使带有RegularExpression验证的字段接受空字段的任何建议?
埃里克K'3

@QuantumDynamix尝试将空字符串测试添加到正则表达式作为一种选择。从未尝试过,但是谁知道呢?
彼得·史密斯

7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }

4

在MVC5项目中使用了上面的代码,并且在验证错误的情况下完全可以正常工作。

   [Required]
   [Display(Name = "Email")]
   [EmailAddress]

   [RegularExpression(@"^([A-Za-z0-9][^'!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ][a-zA-z0- 
    9-._][^!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ]*\@[a-zA-Z0-9][^!&@\\#*$%^?<> 
        ()+=':;~`.\[\]{}|/,₹€ ]*\.[a-zA-Z]{2,6})$", ErrorMessage = "Please enter a 
   valid Email")]


   public string ReceiverMail { get; set; }

1
欢迎使用StackOverflow。仅代码答案不被认为是一种好习惯。请详细说明其作用以及如何解决该问题。
quinz

0

脚本通常在html页面的末尾加载,而MVC建议使用捆绑软件。所以我最好的选择是jquery.validate文件以某种方式更改或未更新为最新版本,因为它们确实可以验证电子邮件输入。

因此,您实际上可以更新/刷新nuget包或编写自己的函数。

这是一个示例,您可以在之后添加一个额外的文件jquery.validate.unobtrusive

$.validator.addMethod(
    "email",
    function (value, element) {
        return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[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( value );
    },
    "This e-mail is not valid"
);

这只是当前jquery.validateRegex 的复制和粘贴,但是通过这种方式,您可以设置自定义错误消息/向可能要在不久的将来验证的字段中添加其他方法。


0

按照上面的方法,这将修复服务器端对电子邮件地址的验证:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

然而...

如果使用的是JQuery客户端验证,则应该知道电子邮件对服务器端(模型验证)与客户端(JQuery验证)的验证方式不同。在那个test @ example(顶级域电子邮件地址)中,服务器端将失败,但客户端将验证正常。

要解决此差异,您可以按如下方法覆盖默认的客户端电子邮件验证:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /[a-z]+@[a-z]+\.[a-z]+/.test(value);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.