1
- using System . Linq ;
1
+ using System ;
2
+ using System . Linq ;
2
3
using System . Threading . Tasks ;
3
4
using FluentValidation ;
4
5
using Microsoft . AspNetCore . Http ;
5
6
using Microsoft . AspNetCore . Mvc ;
6
7
using Microsoft . AspNetCore . Mvc . Controllers ;
7
8
using Microsoft . AspNetCore . Mvc . Filters ;
9
+ using Microsoft . AspNetCore . Mvc . Infrastructure ;
8
10
using Microsoft . AspNetCore . Mvc . ModelBinding ;
9
11
using Microsoft . Extensions . DependencyInjection ;
10
12
using Microsoft . Extensions . Options ;
@@ -22,17 +24,15 @@ public class FluentValidationAutoValidationActionFilter : IAsyncActionFilter
22
24
private readonly IFluentValidationAutoValidationResultFactory fluentValidationAutoValidationResultFactory ;
23
25
private readonly AutoValidationMvcConfiguration autoValidationMvcConfiguration ;
24
26
25
- public FluentValidationAutoValidationActionFilter (
26
- IFluentValidationAutoValidationResultFactory fluentValidationAutoValidationResultFactory ,
27
- IOptions < AutoValidationMvcConfiguration > autoValidationMvcConfiguration )
27
+ public FluentValidationAutoValidationActionFilter ( IFluentValidationAutoValidationResultFactory fluentValidationAutoValidationResultFactory , IOptions < AutoValidationMvcConfiguration > autoValidationMvcConfiguration )
28
28
{
29
29
this . fluentValidationAutoValidationResultFactory = fluentValidationAutoValidationResultFactory ;
30
30
this . autoValidationMvcConfiguration = autoValidationMvcConfiguration . Value ;
31
31
}
32
32
33
33
public async Task OnActionExecutionAsync ( ActionExecutingContext actionExecutingContext , ActionExecutionDelegate next )
34
34
{
35
- if ( actionExecutingContext . Controller is ControllerBase controllerBase )
35
+ if ( IsValidController ( actionExecutingContext . Controller ) )
36
36
{
37
37
var endpoint = actionExecutingContext . HttpContext . GetEndpoint ( ) ;
38
38
var controllerActionDescriptor = ( ControllerActionDescriptor ) actionExecutingContext . ActionDescriptor ;
@@ -108,7 +108,8 @@ public async Task OnActionExecutionAsync(ActionExecutingContext actionExecutingC
108
108
109
109
if ( ! actionExecutingContext . ModelState . IsValid )
110
110
{
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 ) ;
112
113
113
114
actionExecutingContext . Result = fluentValidationAutoValidationResultFactory . CreateActionResult ( actionExecutingContext , validationProblemDetails ) ;
114
115
@@ -119,6 +120,21 @@ public async Task OnActionExecutionAsync(ActionExecutingContext actionExecutingC
119
120
await next ( ) ;
120
121
}
121
122
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
+
122
138
private bool HasValidBindingSource ( BindingSource ? bindingSource )
123
139
{
124
140
return ( autoValidationMvcConfiguration . EnableBodyBindingSourceAutomaticValidation && bindingSource == BindingSource . Body ) ||
0 commit comments