在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
绑定到DateTime?属性。
流动性验证(使用时)
问题出在“ 1。模型绑定”中,在使用API上常见的[FromBody]
时。
使用[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中返回模型绑定错误和Fluent验证错误?
是否可以配置Newtonsoft创建局部模型?