Asp.net mvc 5 asp.net mvc System.ComponentModel.DataAnnotations.EmailAttribute验证客户端与服务器不一致

Asp.net mvc 5 asp.net mvc System.ComponentModel.DataAnnotations.EmailAttribute验证客户端与服务器不一致,asp.net-mvc-5,data-annotations,email-validation,Asp.net Mvc 5,Data Annotations,Email Validation,在asp.net mvc 5.2.4模型上,我有一个电子邮件地址字段,带有System.ComponentModel.DataAnnotations.EmailAddressAttribute: [DataType(DataType.EmailAddress)] [EmailAddress(ErrorMessageResourceName = "EmailField", ErrorMessageResourceType = typeof(Messages))] publi

在asp.net mvc 5.2.4模型上,我有一个电子邮件地址字段,带有System.ComponentModel.DataAnnotations.EmailAddressAttribute:

    [DataType(DataType.EmailAddress)]
    [EmailAddress(ErrorMessageResourceName = "EmailField", ErrorMessageResourceType = typeof(Messages))]
    public string EmailAddress { get; set; }
它呈现如下所示的html,输入类型为电子邮件:

<input type="email".../>
如果我输入一个没有完整域的电子邮件地址,例如tom@yahoo它通过了客户端验证,但服务器端验证失败。我只需要担心Chrome和IE11这两种浏览器,它们都可以通过客户端

我想我明白发生了什么。jquery.validate.js是客户端验证,它遵循国际标准,允许没有域的电子邮件。只要我的arm看到并抛出验证错误,服务器端就会使用正则表达式


我猜我不是第一个碰到这个的人。是否有一个属性可用于修饰电子邮件地址字段,该属性与浏览器中的输入类型=电子邮件完全对应,以便如果电子邮件地址通过客户端验证,它将始终通过服务器端验证?

我的解决方法是删除EmailAddress属性,复制客户端验证jquery.validate.js v1.16.0第1356行使用的正则表达式,并将其用于RegularExpression验证属性,因此我的代码现在如下所示:

    [DataType(DataType.EmailAddress)]
    [RegularExpression(EmailRegEx, ErrorMessageResourceName = "EmailField", ErrorMessageResourceType = typeof(Messages))]
其中EmailRegEx是具有此值的常量:

^[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])?)*$

您可以编写自己的验证器。您已经知道MS正在使用的正则表达式,如果您觉得它更准确/更适合您的需要,那么您可以在引号中重新使用,因为您可能需要在客户端验证器中以不同的格式对其进行格式化。这要求您为服务器端验证创建自己的接口&连接到客户端,您将在js验证器上实现该接口

你有一个优势,你也不必从头开始写。您可以使用的源代码开始

写得很好


另一个例子是,通过比较两个日期同时执行服务器端和客户端操作,但是实现什么和如何实现的想法是相同的。

不太清楚您在这里声称的是什么。如果启用了客户端验证,则在客户端和服务器端使用完全相同的正则表达式,并且不需要包含[DataTypeDataType.EmailAddress]。您是否已禁用mvc的客户端验证,或者未包含jquery.validate.js和jquery.validate.unobtrusive.js脚本?@StephenMuecke,是的,我使用的是jquery unobtrusive验证。客户机和服务器显然使用了不同的验证,这就是我提出这个问题的原因。你是说我应该删除DataType属性吗?是的,删除它。即使有不必要的[DataType]属性,tom@也不会通过mvc客户端验证,所以我只能假设它必须被禁用,或者没有正确实现。很抱歉,你是对的,当然,tom@没有通过客户端验证,我打错了示例。通过客户端验证的是什么tom@yahoo,但这无法通过服务器端验证。我确实正确地实现了客户端验证。我正在使用jquery.validate v1.16.0并在第1356行上放置一个断点,我可以看到这一点tom@yahoo.com通过客户端验证。我还可以看到,客户端验证使用的正则表达式与服务器端验证属性使用的正则表达式不同。