2016-09-20 54 views
0

给定一个包含属性的类并编写自定义验证器(如FooExists),我希望能够在我的FooExists功能中查看相邻的验证装饰器。除非我有更聪明的东西,我应该这样做。C#级属性验证器了解相邻验证器

我有自定义验证器,我扔在各种类的属性顶部。在某些情况下,我将它与[Required]配对。

不需要的情况下,我希望能够检查在我的覆盖范围内IsValid,并以不同方式处理它。

public class ExampleDTO 
{ 
    [Required] 
    [FooExists] 
    public string Foo { get; set; } 

    public string Bar { get; set; } 
} 

public class AnotherExampleDTO 
{ 
    [FooExists] 
    public string Foo { get; set; } 

    public bool IsMoo { get; set; } 
} 

[AttributeUsage(AttributeTargets.Property)] 
sealed public class FooExistsAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     // ideally I could check if this property is required via [Required] 

     // look things up in the database, return true or false 
     return true; 
    } 
} 

这种情况的原因是全部,如果我做一个POST到控制器接收ExampleDTO,它会被验证,使得美孚存在(必需),且这个值是合法的(FooExists)。但是,如果我向接收AnotherExampleDTO的控制器发布POST并省略Foo参数(因为它不是必需的),我不希望它失败FooExists。 FooExists可以检查它是否为空,但我真的想说“如果不需要,并且null,那很好,返回true”。

我曾幻想过与周围加入我自己的必填属性,这样我就可以[FooExists(Required=true)]

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] 
sealed public class FooExistsAttribute : ValidationAttribute 
{ 
    public bool Required { get; set; } 

    public override bool IsValid(object value) 
    { 
     if (!Required && value == null) 
      return true 

     // look things up in the database, return true or false 
     return true; 
    } 
} 

但这种感觉错了,更何况我失去了自由[Required]错误消息。

我也想避免(在这种情况下)在我的DTO继承IValidatableObject并把这个模型:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    // I could check all of the class properties in here 
} 
+0

检查FluentValidation,也许这可以帮助你不必处理自定义属性。 – PmanAce

回答

1

简短的回答:没有

龙答:你可以得到这个行为与一些自定义代码和反射,但在这种情况下,你已经勾画出不需要的。

[Required]属性允许您指定空/空字符串是否有效。它也只验证字符串。验证您需要的整数Range

参见:RequiredAttribute on MSDNRangeAttribute on MSDN

从你的榜样,[FooExists]正如我所说的,是没有作用的,因为你是用一个整数值工作。如果不需要字段,则根本不需要属性。

+0

范围不会告诉您值是否已删除或不再有效。 –

+0

是的,这应该是一个字符串。编辑。 – Jared

+0

接受这个,但附加:我的解决方案是让我的自定义验证器返回true,如果该属性的值为null。如果你不想让null通过,那么这就是为什么他们有[Required]标签,除了[CustomValidator] – Jared