C#类属性验证器了解相邻验证器

时间:2016-09-20 17:44:36

标签: c# validation

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

我有自定义验证器,我抛在各种类的属性之上。在某些情况下,我将其与[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;
    }
}

所有这一切的原因是,如果我向接收ExampleDTO的控制器发出POST,它将被验证,使得Foo存在(必需),并且该值是合法的(FooExists)。但是,如果我向接收AnotherExampleDTO的控制器发出POST,并省略Foo参数(因为它不是必需的),我不希望它失败FooExists。 FooExists可以检查它是否为null,但实际上我想说"如果不是必需而且为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
}

1 个答案:

答案 0 :(得分:1)

简答:否

答案很长:你可以通过一些自定义代码和反射来获得这种行为,但是如果你已经概述了不需要它。

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

请参阅:RequiredAttribute on MSDNRangeAttribute on MSDN

根据你的例子,正如我所说,[FooExists]根本不是很有用,因为你正在使用整数值。如果不需要字段,则根本不需要属性。