【问题标题】:Custom data annotation attribute not being validated未验证自定义数据注释属性
【发布时间】:2014-07-22 16:25:52
【问题描述】:

我正在尝试使用数据注释进行自定义验证。 试图制作属性,我遵循了这个问题: How to create Custom Data Annotation Validators

我的属性是这样的

internal class ExcludeDefaultAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        return false;
    }
}

验证被调用:

internal static class TypeValidator
{
    static public bool Validate(object item)
    {
        List<ValidationResult> results = new List<ValidationResult>();
        ValidationContext context = new ValidationContext(item);
        if (Validator.TryValidateObject(item, context, results))
        {
            return true;
        }
        else
        {
            string message = string.Format("Error validating item");
            throw new TypeInvalidException(results, message);
        }
    }
}

所以,这就是问题所在。目前,我的自定义验证应始终返回 false。所以验证应该总是失败。但是,每当我尝试验证在字段上具有此属性的对象时,它都会通过验证,这表明我的自定义验证属性没有被评估。在我知道它实际运行之前,我不想在验证中创建任何实际逻辑。 我错过了什么吗?我所有的研究都表明我只需要从 ValidationAttribute 继承,但它不起作用。

【问题讨论】:

    标签: c# validation data-annotations


    【解决方案1】:

    根据MSDN article,TryValidateObject 方法将执行以下操作:

    此方法评估附加到对象类型的每个 ValidationAttribute 实例。它还检查是否提供了标记为RequiredAttribute 的每个属性。它不会递归地验证对象的属性值。

    我对此进行了测试,它的行为与使用提供的语法所宣传的一样。

    编辑

    根据下面的评论,使用以下重载可以正确验证所有属性,包括使用自定义属性的属性:

    TryValidateObject(object instance, ValidationContext validationContext, ICollection<ValidationResult> validationResults, bool validateAllProperties)
    

    【讨论】:

    • 文档说它会评估每个 ValidationAttribute,所以它不应该检查我的自定义属性吗?当它说它不递归验证时,我认为这意味着赋予属性的对象没有经过验证。
    • 想通了。 TryValidateObject 有一个可选的第四个参数。如果设置为 true,它会验证所有属性,包括我的自定义属性。
    猜你喜欢
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多