[英]ASP.NET MVC and ASP.NET Membership: implementing email address validation after user registration
[英]Email address validation using ASP.NET MVC data type attributes
我在验证 Email 时遇到一些问题。
在我的 Model 中:
[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)
现在,当您将字段留空时,它会正确地向我显示“字段不能为空”。 但是,当您填写无效的 email 地址时,例如:“fwenrjfw”,那么表单不会显示“电子邮件无效”。
如何获取表单以将输入验证为 email 地址? 我正在为此寻求帮助。
如果您使用 .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; }
尝试Html.EditorFor
辅助方法而不是Html.TextBoxFor
。
您需要使用 RegularExpression 属性,如下所示:
[RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "E-mail is not valid")]
并且不要删除[Required]
因为[RegularExpression]
不影响空字段。
如果您还没有使用 .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; }
}
我使用 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 级别(它很长)。
[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; }
脚本通常在html页面的最后加载,MVC推荐使用bundles,只是说一下。 所以我最好的办法是你的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
Regex 的复制和粘贴,但通过这种方式,您可以设置自定义错误消息/向您可能希望在不久的将来验证的字段添加额外的方法。
如上所述,这将修复电子邮件地址的服务器端验证:
[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-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
[RegularExpression(@"^[A-Za-z0-9]+@([a-zA-Z]+\\.)+[a-zA-Z]{2,6}]&")]
我也遇到过这个问题,当您使用[EmailAddress]
注释时,它允许他们像这样输入 email test@email
并且不需要实际的.com
。 我发现最好的方法就是这样。 我实际上并没有写这个正则表达式,我是在 Stackoverflow 的另一个问题上找到的,或者也许是我问过的一个问题,哈哈。 但是,正则表达式在 @ 之前表示您可以使用连字符 (-) 添加字母和数字,但不能添加特殊字符。 @ 符号你必须添加类似gmail, aol, live, yahoo, etc..
。 @ 符号后必须至少有一个字符。 然后在句点或点。 你必须输入不少于两个字符的内容,例如.com, .net, .org, .infor
我不知道有多少电子邮件以.au
结尾,这意味着澳大利亚以防万一。 现在,如果您想对其进行分解,则必须拨打 go 到该站点RegEx ,以便在底部获得更好的解释。
[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; }
我也遇到了这个问题,你可以试试这个对我有用
[RegularExpression("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", ErrorMessage = "Email is not valid")]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.