使用 DataAnnotations 和 DataType 验证电子邮件模型
Posted
技术标签:
【中文标题】使用 DataAnnotations 和 DataType 验证电子邮件模型【英文标题】:Email model validation with DataAnnotations and DataType 【发布时间】:2012-02-17 19:58:41 【问题描述】:我有以下型号:
public class FormularModel
[Required]
public string Position get; set;
[Required]
[DataType(DataType.EmailAddress)]
public string Email get; set;
[Required]
public string Webcode get; set;
必需的验证工作正常。但是当我尝试使用 DataType 时,它没有反应。
这是我的电子邮件控件的剃须刀代码:
@html.TextBoxFor
(model => model.Email,
new @style = "width: 175px;", @class = "txtField"
) *
那么,有人知道答案吗?
TIA
【问题讨论】:
【参考方案1】:DataType
属性用于格式化目的,而不是用于验证。
我建议您使用ASP.NET MVC 3 Futures 进行电子邮件验证。
示例代码:
[Required]
[DataType(DataType.EmailAddress)]
[EmailAddress]
public string Email get; set;
如果你碰巧在使用.NET Framework 4.5
,那么现在有一个内置的EmailAddressAttribute
存在于System.ComponentModel.DataAnnotations.EmailAddressAttribute
中。
【讨论】:
但它接受 'something@domain' 。我想这次我会使用正则表达式。 因为我们无法提供自定义错误消息。我正在使用以下方式。 [EmailValidation(ErrorMessage = "电子邮件地址已存在")] [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@ [a-z0-9-]+(\\.[a-z0-9]+)*\\.([az]2,4)$" , ErrorMessage = "无效的电子邮件格式。" )] [必填(ErrorMessage = "请输入您的电子邮件地址。"), StringLength(50)] public string Email get;放; “ryan.o'neal@gmail.com”的正则表达式将失败【参考方案2】:DataAnnotationsExtensions 项目有一个您可以使用的Email attribute。
【讨论】:
这个我已经用过了。也很不错!我试图记住这个名字,但我想不起来。最后建议使用 MVC 3 Futures。【参考方案3】:我查看了源代码(由 Reflector 逆向工程)和DataType
变体实际上甚至没有实现! (这是给DateType.Date
)
所以它不会工作。
我个人会使用RegexValidation
发送电子邮件。
为清楚起见,这里是IsValid
在类DataTypeAttribute
中的实现:
public override bool IsValid(object value)
return true;
【讨论】:
呵呵呵呵...一切正常! =) 电子邮件地址的正则表达式验证是一个非常糟糕的主意; RFC 允许许多奇怪的排列使正则表达式可行。即使是 GMail 支持的已标记电子邮件,通常也会被视为无效而被拒绝,尽管它是完全有效的。 (davidcel.is/blog/2012/09/06/… 很好地指出了这一点)。 programmers.stackexchange.com/questions/78353/… 探索了各种选项,但唯一 100% 的保证是通过电子邮件发送地址并检查是否有退回邮件。【参考方案4】:我使用了这种正则表达式模式,它允许一些较新的更长的扩展名(.mynewsite 等)。
@"^[\w-_]+(\.[\w!#$%'*+\/=?\^`|]+)*@((([\-\w]+\.)+[a-zA-Z]2,20)|(([0-9]1,3\.)3[0-9]1,3))$"
无效等:
email@com email-o'neil@mysite.com有效示例:
email@m.superlongextension【讨论】:
对于那些实施正则表达式格式验证的人。这可能会影响您的应用程序的性能。【参考方案5】:我认为您需要在 html 代码中添加一个组件 Html.ValidationMessageFor
。此组件显示验证。
代码可能是(使用剃刀):
@Html.TextBoxFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
试试看。
【讨论】:
以上是关于使用 DataAnnotations 和 DataType 验证电子邮件模型的主要内容,如果未能解决你的问题,请参考以下文章
如果我使用 jQuery 验证,是不是必须使用 DataAnnotations?
如何使用 DataAnnotations & Regex - c# - ASP.NET Core