Как мы все знаем, IResourceFilter
запускается сразу после фильтра авторизации и подходит для коротких циклов.
Однако вы не окажете никакого влияния на результат, установив Result=new BadRequestObjectResult()
по завершении выполнения результата.
См. Рабочий процесс, как показано ниже:
В соответствии с описанным выше рабочим процессом, мы должны запустить MyFilter
после этапа привязки модели и до этапа фильтра результатов. Другими словами, мы должны поместить логику в фильтр действий. Поскольку уже существует ActionFilterAttribute
из коробки, просто создайте MyFilterAttribute
, который наследуется от ActionFilterAttribute
:
public class MyFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
//store request in data base
context.Result = new BadRequestObjectResult(new MyErrorModel() { ID = "1", FriendlyMessage = "Your request was invalid" });
}
}
}
Вот скриншот, с которым работает фильтр:
[Изменить]:
Код контроллера, украшенный [ApiController]
:
namespace App.Controllers
{
[ApiController]
[Route("Hello")]
public class HelloController : Controller
{
[MyFilter]
[HttpGet("index")]
public IActionResult Index(int x)
{
var y =ModelState.IsValid;
return View();
}
}
}