У меня есть этот класс фильтра проверки.
public class ValidationFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
if (!context.ModelState.IsValid)
{
var errorsInModelState = context.ModelState
.Where(x => x.Value?.Errors.Count > 0)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value?.Errors.Select(x => x.ErrorMessage)).ToArray();
var errorResponse = new ErrorResponse();
foreach (var error in errorsInModelState)
{
foreach (var subError in error.Value)
{
var errorModel = new Error
{
FieldName = error.Key,
Message = subError
};
errorResponse.Errors.Add(errorModel);
}
}
context.Result = new BadRequestObjectResult(errorResponse);
return;
}
await next();
}
}
В ASP.NET 5 мы добавляем ValidationFilter, как показано ниже.
services
.AddMvc(options =>
{
options.EnableEndpointRouting = false;
options.Filters.Add<ValidationFilter>();
})
.AddFluentValidation(mvcConfiguration => mvcConfiguration.RegisterValidatorsFromAssemblyContaining<Startup>())
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
Как добавить его в Program.cs в .NET 6?





Вы можете определить класс, унаследованный от ActionFilterAttribute
который добавляет заголовок к ответу в соответствии с приведенным ниже примером кода:
public class ResponseHeaderAttribute : ActionFilterAttribute
{
private readonly string _name;
private readonly string _value;
public ResponseHeaderAttribute(string name, string value) =>
(_name, _value) = (name, value);
public override void OnResultExecuting(ResultExecutingContext context)
{
context.HttpContext.Response.Headers.Add(_name, _value);
base.OnResultExecuting(context);
}
}
Затем вы можете добавить фильтр в свой файл Program.cs (на основе шаблона новой консоли dot net 6):
builder.Services.AddControllersWithViews(options =>
{
options.Filters.Add<ResponseHeaderAttribute>();
});
Теперь вы можете использовать его в своих контроллерах, например:
[ResponseHeader("my-filter", "which has the value")]
public IActionResult DoSomething() =>
Content("I'm trying to do something");
В .Net6 мы используем builder.Services.AddControllersWithViews() вместо services.AddMvc(). Таким образом, вы можете просто установить так:
builder.Services.AddControllersWithViews(options =>
{
options.Filters.Add<ValidationFilter>();
});
Подробнее о .NET 6 новой конфигурации можно узнать в этом связь.