我正在尝试使用注释和一些自定义代码验证嵌套对象(而不是MVC senss中的模型)。
我发现以下帖子很有用
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;
}
}
但是,即使在将validateAllProperties设置为true的情况下调用TryValidateObject时,我也无法获得所有验证错误。
var context = new ValidationContext(cs, null, null);
var results = new List<ValidationResult>();
Validator.TryValidateObject(cs, context, results,true);
如果容器中有任何错误,则只显示这些错误。仅当容器对象中没有错误时,才会显示嵌套对象中的错误。我怀疑它与Validate rouine有关,它返回一个完整列表,而且无法从容器中添加(现有)列表(?)
我可以对常规进行任何修改以显示所有错误吗?
答案 0 :(得分:5)
请参阅此答案:https://stackoverflow.com/a/3400627/724944
因此,类'atributes中存在错误,因此不会调用Validate方法。 我建议像这样使用CustomValidationAttribute:
[CustomValidation(typeof(Customer), "ValidateRelatedObject")]
public CustomerDetails Details
{
get;
private set;
}
public static ValidationResult ValidateRelatedObject(object value, ValidationContext context)
{
var context = new ValidationContext(value, validationContext.ServiceContainer, validationContext.Items);
var results = new List<ValidationResult>();
Validator.TryValidateObject(value, context, results);
// TODO: Wrap or parse multiple ValidationResult's into one ValidationResult
return result;
}