ActionInvocationValidatorBase.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using Abp.Configuration.Startup;
  5. using Abp.Dependency;
  6. using Abp.Runtime.Validation.Interception;
  7. namespace Abp.Web.Validation
  8. {
  9. public abstract class ActionInvocationValidatorBase : MethodInvocationValidator
  10. {
  11. private bool IsSetDataAnnotationAttributeErrors { get; set; }
  12. protected IList<Type> ValidatorsToSkip => new List<Type>
  13. {
  14. typeof(DataAnnotationsValidator),
  15. typeof(ValidatableObjectValidator)
  16. };
  17. protected ActionInvocationValidatorBase(IValidationConfiguration configuration, IIocResolver iocResolver)
  18. : base(configuration, iocResolver)
  19. {
  20. }
  21. public void Initialize(MethodInfo method)
  22. {
  23. base.Initialize(
  24. method,
  25. GetParameterValues(method)
  26. );
  27. }
  28. protected override bool ShouldValidateUsingValidator(object validatingObject, Type validatorType)
  29. {
  30. // Skip DataAnnotations and IValidatableObject validation because MVC does this automatically
  31. if (ValidatorsToSkip.Contains(validatorType))
  32. {
  33. return false;
  34. }
  35. return base.ShouldValidateUsingValidator(validatingObject, validatorType);
  36. }
  37. protected override void ValidateMethodParameter(ParameterInfo parameterInfo, object parameterValue)
  38. {
  39. // If action parameter value is null then set only ModelState errors
  40. if (parameterValue != null)
  41. {
  42. base.ValidateMethodParameter(parameterInfo, parameterValue);
  43. }
  44. if (!IsSetDataAnnotationAttributeErrors)
  45. {
  46. SetDataAnnotationAttributeErrors();
  47. IsSetDataAnnotationAttributeErrors = true;
  48. }
  49. }
  50. protected virtual object[] GetParameterValues(MethodInfo method)
  51. {
  52. var parameters = method.GetParameters();
  53. var parameterValues = new object[parameters.Length];
  54. for (var i = 0; i < parameters.Length; i++)
  55. {
  56. parameterValues[i] = GetParameterValue(parameters[i].Name);
  57. }
  58. return parameterValues;
  59. }
  60. protected abstract void SetDataAnnotationAttributeErrors();
  61. protected abstract object GetParameterValue(string parameterName);
  62. }
  63. }