基于数据注释的验证不适用于导航属性

时间:2014-09-08 05:17:53

标签: c# validation data-annotations

我的课程中有以下课程:

class Container
{
    public Container()
    {
        Contain = new Contain();
    }  

    public Contain Contain { get; set; }
}
class Contain
{
    [Required]
    public string Code { get; set; }
}

如您所见,我使用Code数据注释属性修饰了[Required]属性。我写了一个Validate方法来验证我的对象:

class Program
{
    static bool Validate(object command)
    {
        var validationContext = new ValidationContext(command, null, null);
        var validationMessages = new Collection<ValidationResult>();
        var result =  Validator.TryValidateObject(command, validationContext, validationMessages, true);
        Console.WriteLine("********** " + command.GetType().Name +" **************");

        foreach (var validationMessage in validationMessages)
        {
            Console.WriteLine(validationMessage);
        }
        return result;
    }

    static void Main(string[] args)
    {
        var contain = new Contain();
        Console.WriteLine(Validate(contain));

        var container = new Container();
        Console.WriteLine(Validate(container));
        Console.ReadKey();
    }
}

运行程序时,Validate方法会返回true对象的container,并返回false的{​​{1}}: enter image description here

但是contain包含无效的Container对象(因为其contain属性设置为Code),所以我希望null方法不要&# 39;验证它。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

TryValidateObject方法不会递归地工作。文档说:

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

解决方法是编写自己的TryValidateObject方法的递归版本。另一种解决方案是自定义验证属性。有关详细信息,请参阅此question