Контроллеры Web API не должны проверять ModelState.IsVali d, если они имеют атрибут [ApiController].В этом случае автоматический ответ HTTP 400, содержащий сведения о проблеме, возвращается, когда состояние модели недопустимо.
Один из способов добиться того, чего вы хотите, - подавить это поведение.
Добавьте следующий код в ConfigureServices:
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
Затем вы можете добавить свой код в фильтр - например:
public class SampleActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// do something before the action executes
if(context.ActionArguments != null && context.ActionArguments.Count > 0)
{
//WARNING - you should add "safe" code to access the dictionary
//I have hardcoded the parameter name (data) here for sample only.
var model = context.ActionArguments["data"];
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
// do something after the action executes
}
}
, конечно, вам необходимо применитьФильтр также - в примере ниже, я применил его глобально.Вы можете быть более конкретным, если хотите.
services.AddMvc(
options => options.Filters.Add(new SampleActionFilter())
).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
В коде вашего контроллера вы также можете дополнительно использовать метод TryValidateModel, если хотите, например:
[Route("api/[controller]")]
[ApiController]
public class ProcessController : ControllerBase
{
[HttpPost]
public IActionResult Contact(FormDataModel data)
{
bool validated = TryValidateModel(data);
if (!ModelState.IsValid)
{
ModelState.AddModelError("", "Id cannot be empty..");
return Ok();
}
return Ok();
}
}
Надеюсь, это поможетчтобы решить вашу проблему.