【发布时间】:2018-02-26 22:22:31
【问题描述】:
在 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”),它通过客户端验证,但它失败服务器端验证。我只需要担心 2 个浏览器(Chrome 和 IE 11),它通过客户端。
我想我明白发生了什么。 jquery.validate.js,客户端验证,遵循国际标准,允许没有域的电子邮件。服务器端使用 RegEx 表达式,只要我的手臂(请参阅https://referencesource.microsoft.com/#System.ComponentModel.DataAnnotations/DataAnnotations/EmailAddressAttribute.cs)并引发验证错误。
我猜我不是第一个遇到这种情况的人。是否有一个属性我可以装饰一个与浏览器中的输入 type="email" 完全对应的电子邮件地址字段,这样如果电子邮件地址通过客户端验证,它将始终通过服务器端验证?
【问题讨论】:
-
不太清楚你在这里声称什么。如果您启用了客户端验证,则在客户端和服务器端使用完全相同的正则表达式,并且不需要包含
[DataType(DataType.EmailAddress)]。您是否禁用了 mvc 的客户端验证(或不包括jquery.validate.js和jquery.validate.unobtrusive.js脚本)? -
@StephenMuecke,是的,我正在使用 jquery 不显眼的验证。客户端和服务器显然使用不同的验证,这就是我发布问题的原因。你是说我应该删除 DataType 属性吗?
-
是的,删除它。
-
即使有不必要的
[DataType]属性,“tom@”也不会通过mvc客户端验证,所以我只能假设它必须被禁用,或者没有正确实现 -
对不起,你当然是对的,“tom@”没有通过客户端验证,我打错了例子。通过客户端验证的是“tom@yahoo”,但这无法通过服务器端验证。我确实正确实施了客户端验证。我正在使用 jquery.validate v1.16.0 并在第 1356 行放置一个断点,我可以看到“tom@yahoo.com”通过了客户端验证。我还可以看到客户端验证使用的正则表达式与服务器端使用的验证属性不同。
标签: asp.net-mvc-5 data-annotations email-validation