|
|
|
@ -0,0 +1,71 @@
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel.DataAnnotations;
|
|
|
|
|
using Microsoft.AspNetCore.Mvc.Filters;
|
|
|
|
|
using Microsoft.Extensions.Options;
|
|
|
|
|
using Volo.Abp.Validation;
|
|
|
|
|
|
|
|
|
|
namespace Volo.Abp.AspNetCore.Mvc.Validation
|
|
|
|
|
{
|
|
|
|
|
public class MvcActionInvocationValidator : MethodInvocationValidator
|
|
|
|
|
{
|
|
|
|
|
protected ActionExecutingContext ActionContext { get; private set; }
|
|
|
|
|
|
|
|
|
|
private bool _isValidatedBefore;
|
|
|
|
|
|
|
|
|
|
public MvcActionInvocationValidator(IOptions<AbpValidationOptions> options)
|
|
|
|
|
: base(options)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Initialize(ActionExecutingContext actionContext)
|
|
|
|
|
{
|
|
|
|
|
ActionContext = actionContext;
|
|
|
|
|
|
|
|
|
|
SetDataAnnotationAttributeErrors();
|
|
|
|
|
|
|
|
|
|
base.Initialize(
|
|
|
|
|
actionContext.ActionDescriptor.GetMethodInfo(),
|
|
|
|
|
GetParameterValues(actionContext)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void SetDataAnnotationAttributeErrors(object validatingObject)
|
|
|
|
|
{
|
|
|
|
|
SetDataAnnotationAttributeErrors();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void SetDataAnnotationAttributeErrors()
|
|
|
|
|
{
|
|
|
|
|
if (_isValidatedBefore || ActionContext.ModelState.IsValid)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var state in ActionContext.ModelState)
|
|
|
|
|
{
|
|
|
|
|
foreach (var error in state.Value.Errors)
|
|
|
|
|
{
|
|
|
|
|
ValidationErrors.Add(new ValidationResult(error.ErrorMessage, new[] { state.Key }));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_isValidatedBefore = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual object[] GetParameterValues(ActionExecutingContext actionContext)
|
|
|
|
|
{
|
|
|
|
|
var methodInfo = actionContext.ActionDescriptor.GetMethodInfo();
|
|
|
|
|
|
|
|
|
|
var parameters = methodInfo.GetParameters();
|
|
|
|
|
var parameterValues = new object[parameters.Length];
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < parameters.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
parameterValues[i] = actionContext.ActionArguments.GetOrDefault(parameters[i].Name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return parameterValues;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|