使用 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 验证电子邮件模型的主要内容,如果未能解决你的问题,请参考以下文章

CodeFirstConventions

如果我使用 jQuery 验证,是不是必须使用 DataAnnotations?

使用 DataAnnotations 比较两个模型属性

如何使用 DataAnnotations & Regex - c# - ASP.NET Core

使用 Validator 类验证 DataAnnotations

如何使用 DataAnnotations 来检查一个属性只匹配一个字符串数组