ASP.NET MVC 5中EmailAddress属性验证不严谨,如何修正?
解决ASP.NET MVC5中EmailAddress属性宽松验证的问题
这个问题我之前也碰到过,ASP.NET MVC5自带的EmailAddressAttribute确实比较宽松——它遵循RFC 5322的标准,允许像tom@jerry这种没有顶级域名的格式(比如内部网络里的user@localhost这类场景)。但如果我们需要更严格的验证,确保邮箱必须带.com/.cn这类后缀,可以用下面两种方法解决:
方法一:自定义严格邮箱验证属性
我们可以自己写一个继承自ValidationAttribute的自定义属性,用更严格的正则规则来校验邮箱格式。
首先创建自定义属性类:
using System.ComponentModel.DataAnnotations; using System.Text.RegularExpressions; public class StrictEmailAddressAttribute : ValidationAttribute { // 定义严格的邮箱正则,要求必须包含域名后缀 private const string StrictEmailPattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"; protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value == null || string.IsNullOrWhiteSpace(value.ToString())) { // 如果是必填项,建议结合[Required]属性一起使用,这里默认允许空值 return ValidationResult.Success; } var email = value.ToString(); if (!Regex.IsMatch(email, StrictEmailPattern)) { return new ValidationResult(ErrorMessage ?? "请输入有效的邮箱地址(需包含域名后缀,如.com/.cn)"); } return ValidationResult.Success; } }
然后在模型中使用这个自定义属性:
public class UserInfoModel { [StrictEmailAddress(ErrorMessage = "邮箱格式不正确,请输入如tom@jerry.com的合法地址")] public string Email { get; set; } }
方法二:直接使用RegularExpressionAttribute替代
如果不想写自定义属性,也可以直接用RegularExpressionAttribute指定严格的正则,甚至可以和EmailAddressAttribute配合做双重校验:
public class UserInfoModel { [EmailAddress] [RegularExpression(@"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", ErrorMessage = "邮箱必须包含合法域名后缀,例如:tom@jerry.com")] public string Email { get; set; } }
正则表达式说明
上面用到的正则^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$各部分含义:
^[a-zA-Z0-9._%+-]+:匹配邮箱用户名部分,允许字母、数字和常见符号@:匹配邮箱必备的@符号[a-zA-Z0-9.-]+:匹配域名前缀(比如jerry)\.[a-zA-Z]{2,}:强制匹配域名后缀,必须包含一个点,且点后至少有2个字母(比如.com/.org/.cn)
验证效果
经过以上设置后,输入tom@jerry会直接触发验证错误,只有像tom@jerry.com、tom@jerry.cn这类带合法后缀的邮箱才会被判定为有效。
内容的提问来源于stack exchange,提问作者Tural Asgarov
相关产品推荐
相关产品推荐

