【问题标题】:asp.net mvc System.ComponentModel.DataAnnotations.EmailAttribute inconsistent validation client vs. serverasp.net mvc System.ComponentModel.DataAnnotations.EmailAttribute 验证客户端与服务器不一致
【发布时间】: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.jsjquery.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


【解决方案1】:

您可以编写自己的验证器。您已经知道 MS 正在使用的正则表达式,如果您认为它更准确/更适合您的需求,那么您可以在客户端验证器中“重用”(在引号中,因为您可能必须以不同的格式对其进行格式化)。这要求您创建自己的 ValidationAttribute 用于服务器端验证并连接到客户端,您将在 js 验证器上实现 IClientValidatable 接口和 add a method

你有一个优势,你也不必从头开始编写它。您可以使用EmailAddressAttribute 的源代码来帮助您入门。

http://ezzylearning.com/tutorial/creating-custom-validation-attribute-in-asp-net-mvc 写得很好。

MVC custom validation: compare two dates 有另一个通过比较两个日期来执行服务器端和客户端的示例,但是实现什么和如何实现的想法是相同的。

【讨论】:

    【解决方案2】:

    我的解决方法是删除 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])?)*$
    

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2010-09-14
      • 2020-09-08
      相关资源
      最近更新 更多