1- using System . Linq ;
1+ using System ;
2+ using System . Linq ;
23using System . Threading . Tasks ;
34using FluentValidation ;
45using Microsoft . AspNetCore . Http ;
56using Microsoft . AspNetCore . Mvc ;
67using Microsoft . AspNetCore . Mvc . Controllers ;
78using Microsoft . AspNetCore . Mvc . Filters ;
9+ using Microsoft . AspNetCore . Mvc . Infrastructure ;
810using Microsoft . AspNetCore . Mvc . ModelBinding ;
911using Microsoft . Extensions . DependencyInjection ;
1012using Microsoft . Extensions . Options ;
@@ -22,17 +24,15 @@ public class FluentValidationAutoValidationActionFilter : IAsyncActionFilter
2224 private readonly IFluentValidationAutoValidationResultFactory fluentValidationAutoValidationResultFactory ;
2325 private readonly AutoValidationMvcConfiguration autoValidationMvcConfiguration ;
2426
25- public FluentValidationAutoValidationActionFilter (
26- IFluentValidationAutoValidationResultFactory fluentValidationAutoValidationResultFactory ,
27- IOptions < AutoValidationMvcConfiguration > autoValidationMvcConfiguration )
27+ public FluentValidationAutoValidationActionFilter ( IFluentValidationAutoValidationResultFactory fluentValidationAutoValidationResultFactory , IOptions < AutoValidationMvcConfiguration > autoValidationMvcConfiguration )
2828 {
2929 this . fluentValidationAutoValidationResultFactory = fluentValidationAutoValidationResultFactory ;
3030 this . autoValidationMvcConfiguration = autoValidationMvcConfiguration . Value ;
3131 }
3232
3333 public async Task OnActionExecutionAsync ( ActionExecutingContext actionExecutingContext , ActionExecutionDelegate next )
3434 {
35- if ( actionExecutingContext . Controller is ControllerBase controllerBase )
35+ if ( IsValidController ( actionExecutingContext . Controller ) )
3636 {
3737 var endpoint = actionExecutingContext . HttpContext . GetEndpoint ( ) ;
3838 var controllerActionDescriptor = ( ControllerActionDescriptor ) actionExecutingContext . ActionDescriptor ;
@@ -108,7 +108,8 @@ public async Task OnActionExecutionAsync(ActionExecutingContext actionExecutingC
108108
109109 if ( ! actionExecutingContext . ModelState . IsValid )
110110 {
111- var validationProblemDetails = controllerBase . ProblemDetailsFactory . CreateValidationProblemDetails ( actionExecutingContext . HttpContext , actionExecutingContext . ModelState ) ;
111+ var problemDetailsFactory = serviceProvider . GetRequiredService < ProblemDetailsFactory > ( ) ;
112+ var validationProblemDetails = problemDetailsFactory . CreateValidationProblemDetails ( actionExecutingContext . HttpContext , actionExecutingContext . ModelState ) ;
112113
113114 actionExecutingContext . Result = fluentValidationAutoValidationResultFactory . CreateActionResult ( actionExecutingContext , validationProblemDetails ) ;
114115
@@ -119,6 +120,21 @@ public async Task OnActionExecutionAsync(ActionExecutingContext actionExecutingC
119120 await next ( ) ;
120121 }
121122
123+ private bool IsValidController ( object controller )
124+ {
125+ var controllerType = controller . GetType ( ) ;
126+
127+ if ( controllerType . HasCustomAttribute < NonControllerAttribute > ( ) )
128+ {
129+ return false ;
130+ }
131+
132+ return controller is ControllerBase ||
133+ controllerType . HasCustomAttribute < ControllerAttribute > ( ) ||
134+ controllerType . Name . EndsWith ( "Controller" , StringComparison . OrdinalIgnoreCase ) ||
135+ controllerType . InheritsFromTypeWithNameEndingIn ( "Controller" ) ;
136+ }
137+
122138 private bool HasValidBindingSource ( BindingSource ? bindingSource )
123139 {
124140 return ( autoValidationMvcConfiguration . EnableBodyBindingSourceAutomaticValidation && bindingSource == BindingSource . Body ) ||
0 commit comments