繁体   English   中英

Email 使用 ASP.NET MVC 数据类型属性进行地址验证

[英]Email address validation using ASP.NET MVC data type attributes

我在验证 Email 时遇到一些问题。

在我的 Model 中:

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

现在,当您将字段留空时,它会正确地向我显示“字段不能为空”。 但是,当您填写无效的 email 地址时,例如:“fwenrjfw”,那么表单不会显示“电子邮件无效”。

如何获取表单以将输入验证为 email 地址? 我正在为此寻求帮助。

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

您的代码应该类似于:

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

尝试Html.EditorFor辅助方法而不是Html.TextBoxFor

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

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

并且不要删除[Required]因为[RegularExpression]不影响空字段。

如果您还没有使用 .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";
    }
}

然后你可以这样做:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }

我使用 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; }

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

[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }

在 MVC5 项目中使用了上面的代码,它在验证错误的情况下完全正常工作。 试试这个代码:

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

脚本通常在html页面的最后加载,MVC推荐使用bundles,只是说一下。 所以我最好的办法是你的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 的复制和粘贴,但通过这种方式,您可以设置自定义错误消息/向您可能希望在不久的将来验证的字段添加额外的方法。

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

[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);
}
[RegularExpression(@"^[A-Za-z0-9]+@([a-zA-Z]+\\.)+[a-zA-Z]{2,6}]&")]

我也遇到过这个问题,当您使用[EmailAddress]注释时,它允许他们像这样输入 email test@email并且不需要实际的.com 我发现最好的方法就是这样。 我实际上并没有写这个正则表达式,我是在 Stackoverflow 的另一个问题上找到的,或者也许是我问过的一个问题,哈哈。 但是,正则表达式在 @ 之前表示您可以使用连字符 (-) 添加字母和数字,但不能添加特殊字符。 @ 符号你必须添加类似gmail, aol, live, yahoo, etc.. @ 符号后必须至少有一个字符。 然后在句点或点。 你必须输入不少于两个字符的内容,例如.com, .net, .org, .infor我不知道有多少电子邮件以.au结尾,这意味着澳大利亚以防万一。 现在,如果您想对其进行分解,则必须拨打 go 到该站点RegEx ,以便在底部获得更好的解释。

[Required, MinLength(1), DataType(DataType.EmailAddress), EmailAddress, MaxLength(50), Display(Name = "Email")]
[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "Please enter a valid e-mail adress")]
public string EMail { get; set; }

我也遇到了这个问题,你可以试试这个对我有用

[RegularExpression("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", ErrorMessage = "Email is not valid")]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM