C# 使用ASP.NET MVC数据类型属性验证电子邮件地址

C# 使用ASP.NET MVC数据类型属性验证电子邮件地址,c#,asp.net-mvc,validation,email-validation,C#,Asp.net Mvc,Validation,Email Validation,我对电子邮件的验证有一些问题 在我的模型中: [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.mi

我对电子邮件的验证有一些问题

在我的模型中:

[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)

@Html.TextBoxFor(m=>m.ReceiverMail,新的{@placeholder=“E-mail”})
@Html.ValidationMessageFor(m=>m.ReceiverMail)
现在,当您将字段留空时,它正确地向我显示“字段不能为空”。 但是,当你填写一个无效的电子邮件地址,如:“fwenrjfw”,那么表格上就不会说“电子邮件无效”


如何获取表单以将输入验证为电子邮件地址?我正在寻求一些帮助

您需要使用RegularExpression属性,如下所示:

[RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "E-mail is not valid")]

不要删除
[必需的]
,因为
[正则表达式]
不会影响空字段。

尝试
Html.EditorFor
助手方法,而不是
Html.TextBoxFor
我使用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; }

如果输入是可选的,请删除所需的
。不需要正则表达式,尽管我有一个正则表达式,它涵盖了RFC 2822级别的电子邮件地址中的所有选项(非常长)。

如果您使用的是.NET Framework 4.5,解决方案是使用
EmailAddressAttribute
,它位于
System.ComponentModel.DataAnnotations

您的代码应类似于以下内容:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

如果您尚未使用.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";
    }
}
//
///TODO:升级到.NET4.5之后,就不再需要这样做了。
/// 
公共类EmailAnnotation:RegularExpressionAttribute
{
静态EmailAnnotation()
{
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAnnotation)、typeof(RegularExpressionAttributeAdapter));
}
/// 
///发件人:http://stackoverflow.com/a/6893571/984463
/// 
公共电子邮件注释()
:base(@“^[\w!\$%&'*+\-/=?\^{{124;}]+(\.[\ w!\\$%&'*+\-/=?\^{{124;}]+)*”
+ "@"
+“(([\-\w]+\)+[a-zA-Z]{2,4}){124;”([0-9]{1,3}){3}[0-9]{1,3}))$”{}
公共重写字符串FormatErrorMessage(字符串名称)
{
返回“电子邮件无效”;
}
}
然后你可以这样做:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }
公共类联系人EmailAddressdTo
{
public int ContactId{get;set;}
[必需]
[显示(Name=“新电子邮件地址”)]

[EmailAnnotation]//**脚本通常加载在html页面的末尾,MVC建议使用捆绑包,只是这么说。因此,我的最佳选择是您的
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的复制和粘贴,但通过这种方式,您可以设置自定义错误消息/向您可能希望在不久的将来验证的字段添加额外的方法。

在MVC5项目中使用了上述代码,它可以完全正常工作
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }
验证错误。请尝试以下代码:

   [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; }
[必需]
[显示(Name=“电子邮件”)]
[电邮地址]
[RegularExpression(@“^([A-Za-z0-9][^'!&\\\\\\\*$%^?()+=:;`~\[\]{}}/,₹欧元][a-zA-z0-
9-._][^!&\\#*$%^?()+=:;`~\[\]{}|/,₹欧元]*\@[a-zA-Z0-9][^!&\\\\\\*$%^?
()+=':;~`.\[\]{}|/,₹€]*\[a-zA-Z]{2,6})$”,ErrorMessage=“请输入
有效电子邮件“)]
公共字符串ReceiverMail{get;set;}

如上所述,这将修复电子邮件地址的服务器端验证:

[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);
}

这是正确答案,因为它将使用您在模型中已添加的数据类型和错误。此方法不会检查域tld,因此有人可以输入myname@whatever并省略掉.com,它将进行验证correctlymyname@whatever是一个有效的电子邮件地址,适用于MVC4。谢谢。在html.Editor中写什么才能有效ate电子邮件?您的电子邮件属性位于哪个名称空间?还是自定义属性?MVC 4使用
[EmailAddress]
并且您需要使用System.ComponentModel.DataAnnotations;
似乎无论我做什么,使用
电子邮件
正则表达式
都会使字段成为必需的。删除
必需的
注释没有任何效果。关于如何使用
正则表达式创建字段的任何建议xpression
validation接受空字段?@QuantumDynamix尝试将空字符串测试作为一个选项添加到正则表达式中。从未尝试过,但谁知道呢?旧的skool很不错,但由于Microsoft实现了一个属性,它解决了在某些情况、国家、时区或行星中可能发生的错误和疏忽。因此它是最好的使用完全发布的代码库而不是自定义正则表达式。例如,您的正则表达式是否考虑了新的顶级域?对于任何包含外来字符或许多非标准字符的电子邮件地址,正则表达式看起来都会失败。使用正则表达式验证电子邮件地址通常是一个糟糕的主意……但如果必须这样做,则有一个e这里有很好的参考..这个正则表达式和网站是错误的。有很多新的TLD超过6个字符。不要遵循这个。谢谢@Shittu Olugbenga!但我不明白为什么这样不行:
[DataType(DataType.EmailAddress,ErrorMessage=“Error message.”]
@Wellington Zanelli-数据类型(DataType.EmailAddress)不能用于valida
[RegularExpression(@"^[A-Za-z0-9]+@([a-zA-Z]+\\.)+[a-zA-Z]{2,6}]&")]