如何使用自定义类型的标准验证数据注释?

时间:2018-02-03 16:52:18

标签: c# validation asp.net-web-api data-annotations

是否可以在.NET框架中使用标准数据注释(例如StringLength,RegularExpression,Required等)和自定义类型?

我想做的是这样的事情:

  class MyProperty<TValue>
   {
      public bool Reset { get; set; }
      public TValue Value { get; set; }
   }

   class MyClass
   {
      [Required]
      [StringLength(32)]
      MyProperty<string> Name { get; set; }

      [StringLength(128)]
      MyProperty<string> Address { get; set; }

   }

当然,我希望验证能够对“价值”属性采取行动。查看各种验证属性的代码,看起来他们只是调用ToString()从对象中获取值。我尝试重写ToString()并将Value作为字符串返回,但是抛出了激活,说明注释不能将对象(Value)强制转换为字符串(即使覆盖只是那样......?)。

我正在努力避免编写所有各种可能的验证器的自定义版本以适应这种简单类型。

1 个答案:

答案 0 :(得分:1)

您可以查看StringLength的源代码: https://github.com/Microsoft/referencesource/blob/master/System.ComponentModel.DataAnnotations/DataAnnotations/StringLengthAttribute.cs

您可以看到IsValid将您的值转换为字符串,这对您的自定义类来说会失败。但您可以创建自己的验证属性。

这是一个明确的字符串转换选项,用于不编写自己的验证器:

public static explicit operator string(MyProperty prop)
{
       return "Stuff you want to return as string";
}

将它放在MyProperty类中。