using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using Abp.Collections.Extensions; namespace Abp.Runtime.Validation.Interception { public class DataAnnotationsValidator : IMethodParameterValidator { public virtual IReadOnlyList Validate(object validatingObject) { return GetDataAnnotationAttributeErrors(validatingObject); } /// /// Checks all properties for DataAnnotations attributes. /// protected virtual List GetDataAnnotationAttributeErrors(object validatingObject) { var validationErrors = new List(); var properties = TypeDescriptor.GetProperties(validatingObject).Cast(); foreach (var property in properties) { var validationAttributes = property.Attributes.OfType().ToArray(); if (validationAttributes.IsNullOrEmpty()) { continue; } var validationContext = new ValidationContext(validatingObject) { DisplayName = property.DisplayName, MemberName = property.Name }; foreach (var attribute in validationAttributes) { var result = attribute.GetValidationResult(property.GetValue(validatingObject), validationContext); if (result != null) { validationErrors.Add(result); } } } return validationErrors; } } }