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

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

在我的模型中:

[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)

现在它正确地向我显示“ Field can’t be null”,当您将该字段保持为空时。 但是,当你填写一个无效的电子邮件地址,如: “ fwenrjfw”,那么表单没有说“电子邮件是无效的”。

我怎样才能让表单验证输入为电子邮件地址?我在寻求帮助。

326239 次浏览

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

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

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

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

我使用 MVC 3。我的一个类中的电子邮件地址属性的例子是:

[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级(它非常长)。

如果使用.NET Framework 4.5,解决方案是使用位于 System.ComponentModel.DataAnnotations内部的 EmailAddressAttribute

您的代码应该类似于下面这样:

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

如果你还没有使用.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; }
}

脚本通常加载在 html 页面的末尾,MVC 建议使用 bundle,这只是说说而已。因此,我的最佳选择是,您的 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.validate正则表达式的复制和粘贴,但是通过这种方式,您可以设置自定义错误消息/向您可能希望在不久的将来进行验证的字段添加额外的方法。

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

在 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; }

如上所述,这将修复电子邮件地址的服务器端验证:

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

但是..。

如果您正在使用 JQuery 客户端验证,那么您应该知道 Email 对服务器端(模型验证)和客户端(JQuery 验证)的验证是不同的。在这个 test@example (顶级域电子邮件地址)中,服务器端会出现故障,但是在客户端会进行验证。

要修复这种差异,您可以覆盖默认的客户端电子邮件验证如下:

$.validator.methods.email = function (value, element) {
return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
[RegularExpression(@"^[A-Za-z0-9]+@([a-zA-Z]+\\.)+[a-zA-Z]{2,6}]&")]

我也有这个问题,当你使用 [EmailAddress]注释,它允许他们把这样的 test@email的电子邮件,并不需要一个实际的 .com。我发现最好的办法就是这样。实际上我并没有写这个正则快递,我是在 Stackoverflow 的另一个问题上找到它的,或者是我问 lol 的一个问题。但是,正则表达式在@之前表示,您可以使用一个分音符(-)添加字母和数字,但不能使用特殊字符。@ 符号必须添加类似于 gmail, aol, live, yahoo, etc..的内容。它必须在@符号后面至少有一个字符。然后在句点或点。你必须放一些不少于两个字符像 .com, .net, .org, .infor我不知道很多电子邮件以 .au结尾,这意味着澳大利亚只是以防万一。现在,如果你想打破它,你必须到这个网站 正方体在底部更好的解释。

[Required, MinLength(1), DataType(DataType.EmailAddress), EmailAddress, MaxLength(50), Display(Name = "Email")]
[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "Please enter a valid e-mail adress")]
public string EMail { get; set; }