asp.net-mvc – 尝试继承RegularExpressionAttribute,不再验证

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 尝试继承RegularExpressionAttribute,不再验证前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试继承RegularExpressionAttribute以通过验证SSN来提高可重用性.

我有以下型号:

  1. public class FooModel
  2. {
  3. [RegularExpression(@"^(?!000)(?!666)(?!9[0-9][0-9])\d{3}[- ]?(?!00)\d{2}[- ]?(?!0000)\d{4}$",ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank")]
  4. public string Ssn { get; set; }
  5. }

这将在客户端和服务器上正确验证.我想将这个冗长的正则表达式封装到自己的验证属性中,如下所示:

  1. public class SsnAttribute : RegularExpressionAttribute
  2. {
  3. public SsnAttribute() : base(@"^(?!000)(?!666)(?!9[0-9][0-9])\d{3}[- ]?(?!00)\d{2}[- ]?(?!0000)\d{4}$")
  4. {
  5. ErrorMessage = "SSN is invalid";
  6. }
  7. }

然后我像这样改变了我的FooModel:

  1. public class FooModel
  2. {
  3. [Ssn(ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank")]
  4. public string Ssn { get; set; }
  5. }

现在,验证不会在客户端上呈现不显眼的数据属性.我不太清楚为什么,因为这看起来两者本质上应该是一回事.

有什么建议?

解决方法

在Application_Start中添加以下行以将Adaptiveater与您的自定义属性相关联,该属性将负责发出客户端验证属性
  1. DataAnnotationsModelValidatorProvider.RegisterAdapter(
  2. typeof(SsnAttribute),typeof(RegularExpressionAttributeAdapter)
  3. );

您需要这个的原因是RegularExpressionAttribute的实现方式.它没有实现IClientValidatable接口,而是具有与之关联的RegularExpressionAttributeAdapter.

在您的情况下,您有一个派生自RegularExpressionAttribute的自定义属性,但您的属性未实现IClientValidatable接口,以便客户端验证工作,也没有与其关联的属性适配器(与其父类相反).因此,您的SsnAttribute应该实现IClientValidatable接口,或者如我之前的答案中所建议的那样关联适配器.

这是个人说的,我没有看到实现这个自定义验证属性的重点.在这种情况下,常量可能就足够了:

  1. public const string Ssn = @"^(?!000)(?!666)(?!9[0-9][0-9])\d{3}[- ]?(?!00)\d{2}[- ]?(?!0000)\d{4}$",ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank";

然后:

  1. public class FooModel
  2. {
  3. [RegularExpression(Ssn,ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank")]
  4. public string Ssn { get; set; }
  5. }

看起来很可读.

猜你在找的asp.Net相关文章