DataAnnotationsValidator.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System.Collections.Generic;
  2. using System.ComponentModel;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Linq;
  5. using Abp.Collections.Extensions;
  6. namespace Abp.Runtime.Validation.Interception
  7. {
  8. public class DataAnnotationsValidator : IMethodParameterValidator
  9. {
  10. public virtual IReadOnlyList<ValidationResult> Validate(object validatingObject)
  11. {
  12. return GetDataAnnotationAttributeErrors(validatingObject);
  13. }
  14. /// <summary>
  15. /// Checks all properties for DataAnnotations attributes.
  16. /// </summary>
  17. protected virtual List<ValidationResult> GetDataAnnotationAttributeErrors(object validatingObject)
  18. {
  19. var validationErrors = new List<ValidationResult>();
  20. var properties = TypeDescriptor.GetProperties(validatingObject).Cast<PropertyDescriptor>();
  21. foreach (var property in properties)
  22. {
  23. var validationAttributes = property.Attributes.OfType<ValidationAttribute>().ToArray();
  24. if (validationAttributes.IsNullOrEmpty())
  25. {
  26. continue;
  27. }
  28. var validationContext = new ValidationContext(validatingObject)
  29. {
  30. DisplayName = property.DisplayName,
  31. MemberName = property.Name
  32. };
  33. foreach (var attribute in validationAttributes)
  34. {
  35. var result = attribute.GetValidationResult(property.GetValue(validatingObject), validationContext);
  36. if (result != null)
  37. {
  38. validationErrors.Add(result);
  39. }
  40. }
  41. }
  42. return validationErrors;
  43. }
  44. }
  45. }