我的课程中有以下课程:
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}}:
但是contain
包含无效的Container
对象(因为其contain
属性设置为Code
),所以我希望null
方法不要&# 39;验证它。
有没有办法做到这一点?
答案 0 :(得分:0)
TryValidateObject方法不会递归地工作。文档说:
此方法评估附加到对象类型的每个ValidationAttribute实例。它还检查是否提供了标记为RequiredAttribute的每个属性。 不以递归方式验证对象的属性值。
解决方法是编写自己的TryValidateObject方法的递归版本。另一种解决方案是自定义验证属性。有关详细信息,请参阅此question。