На ASP.NET Core 2.2 ApiController у меня есть следующее действие:
public async Task<IActionResult> Create([FromBody]Model model) {
}
Где Model
следующее:
public class Model {
public String Title { get; set; }
public DateTime? PublishedAt { get; set; }
}
Я использую FluentValidation
дляпроверьте модель:
public class ModelValidator : AbstractValidator<Model> {
public ModelValidator() {
RuleFor(x => x.Title).NotEmpty().MaximumLength(80);
RuleFor(x => x.PublishedAt).NotNull().Must(x => x < DateTime.Now);
}
}
Когда PublishedAt
недопустим, например, 2019-40-80
, ModelValidator
не запускается ...
Это потому, что проверка в ASP.NET Coreследует, если я не ошибаюсь, порядок:
Привязка модели
Возвращает неверный запрос с ошибками, которые произошли в привязке модели.
Например, еслион не может связать 2019-40-80
с датой?имущество.
Проверка достоверности (при использовании)
- Стандартное ядро ASP.NET
Проблема в " 1. Привязка модели"где при использовании [FromBody]
, который является общим для API.
При использовании [FromBody]
NewtonSoft отвечает за синтаксический анализ тела JSON.
Если произойдет сбой, тогдавозвращает ошибки с BadRequest, и ModelValidator не вызывается.
Я пытался со следующим на ConfigureServices:
services.Configure<ApiBehaviorOptions>(x => {
x.SuppressModelStateInvalidFilter = false;
x.InvalidModelStateResponseFactory = y => {
var errors = y.ModelState
.Where(e => e.Value.Errors.Count > 0)
.Select(e => new {
Name = e.Key,
Message = e.Value.Errors.First().ErrorMessage
}).ToArray();
return new BadRequestObjectResult(errors);
};
});
Но не повезло ...
Вопрос
Как вернуть ошибки привязки модели и текущие проверки в одном BadRequest?
Есть ли способ настроить Newtonsoft для создания частичной модели?