ASP.NET MVC客户端电子邮件验证无法正常工作

12

我在注册表单中想要使用MVC正则表达式进行一些客户端验证,但是它不起作用...以下是模型代码的一部分:

        [Required]
        [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")]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Email address*")]
        public string Email { get; set; }

但是信息无论如何都不想出现...这里出了什么问题?

编辑

在我的视图中我有这个

            <div>
            <div class="editor-label">
                @Html.LabelFor(m => m.Email)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Email)
                @Html.ValidationMessageFor(m => m.Email)
            </div>
            </div>

我还在我的布局中包含了jQuery库

<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title</title>
    <link href="/Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
    <script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
    <script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script>
    <script type="text/javascript" src="/Scripts/jquery.validate.min.js"></script>
    <script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
    @RenderSection("Head")
</head>

1
只是一个小提示。看一下NuGet包DataAnnotationsExtensions。它有一个电子邮件DataAnnotation,你可以使用 :) http://dataannotationsextensions.org/ - Kevin Cloet
5
请考虑用更强大的方式替换基于正则表达式的电子邮件验证,因为它无法通过太多合法地址,包括foo+bar@test.comfoo@bar.museum,而且在应该失败时也不会失败,例如foo..x@test.com。我建议您使用 **EmailVerify.NET**,这是一个强大的 .NET 电子邮件验证 组件,可以轻松与您的 ASP.NET MVC 项目集成。免责声明:我是 EmailVerify.NET 的首席开发人员。 - Efran Cobisi
2个回答

27

我终于弄明白了......在正则表达式属性之后替换必需属性就解决了问题)))

而不是这个

        [Required]
        [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")]

        [DataType(DataType.EmailAddress)]
        [Display(Name = "Email address*")]
        public string Email { get; set; }

现在我有了

        [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")]
        [Required]

        [DataType(DataType.EmailAddress)]
        [Display(Name = "Email address*")]
        public string Email { get; set; }

现在它完美地工作了!


这听起来像是您依赖于顺序来验证属性。如果字段具有值且该值不符合正则表达式模式,则正则表达式验证的消息将仅出现。如果字段为空,则在输入值之前,您将收到“必填”属性验证消息。 - Russ Cam

3

您还需要:

1.在要显示消息的视图中添加@Html.ValidationMessageFor(m => m.Email)

2.包含客户端验证所需的JavaScript文件。如果您正在使用不显眼的验证,则应该是:

jQuery, 
jQuery validate, 
jQuery validate unobtrusive 

按照这个顺序。

如果您检查DOM,您能看到电子邮件输入框上的data-val-regex-pattern="^([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})(\]?)$"吗? - Russ Cam
不,我用Firebug看不到它...但我不知道为什么...没有任何data-val-regex-pattern属性。 - Chuck Norris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接