【问题标题】:Email model validation with DataAnnotations and DataType使用 DataAnnotations 和 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

【问题讨论】:

    标签: c# asp.net-mvc validation email model


    【解决方案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)
    

    试试看。

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2019-05-07
      • 2019-06-23
      相关资源
      最近更新 更多