我想验证使用注释和一些自定义代码的嵌套对象(不是MVC senss中的模型)。使用注释和IValidatableObject递归验证
我发现下面的帖子有用
Using Data Annotations Validation Manually and Object Graphs
作为一个答案的建议,我已经创建了一个额外的常规容器类验证嵌套对象。这里是我修改的测试代码
public class Customer : IValidatableObject
{
public Customer()
{
Details = new CustomerDetails();
}
[Required]
[MaxLength(2)]
public string Name
{
get;
set;
}
public CustomerDetails Details
{
get;
private set;
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var context = new ValidationContext(this.Details, validationContext.ServiceContainer, validationContext.Items);
var results = new List<ValidationResult>();
Validator.TryValidateObject(this.Details, context, results);
return results;
}
}
不过,我有一个获得所有的验证错误的问题,设置为true validateAllProperties调用TryValidateObject时也是如此。
var context = new ValidationContext(cs, null, null);
var results = new List<ValidationResult>();
Validator.TryValidateObject(cs, context, results,true);
如果容器中有任何错误,只会显示这些错误。只有在容器对象中没有错误时,才会显示嵌套对象中的错误。我怀疑它与Validate rouine返回一个完整列表有关,并且不能从容器(?)添加到(现有的)列表中
是否有任何修改我可以让例程来获取所有错误显示?
好吧,如果我理解正确的话,“validateAllProperties”只会影响注解性,不是一个独立的验证程序?但我确实尝试实施你的日常工作,但是我对你作为TODO留下的问题存在问题。由于ValidateRelatedObject返回单个ValidationResult(对于单个注释属性),我怎样才能将潜在错误列表(从嵌套对象中)推送到容器对象中的潜在错误列表中?原来的例子在这方面似乎更有希望,因为它返回了一份清单。非常感谢您的帮助! – goorj
在我的项目中,我简单地枚举了所有ValidationResult的和合并错误到一个字符串中,用新行分隔。后来,当我需要使用它时,我只是将错误分成多行。你也可以考虑创建一个像MultiValidationResult这样的类,它将存储实际的ValidationResult并显示连接错误。 – surfen