单个BadRequest中的返回模型绑定错误和Fluent验证错误

时间:2019-05-01 12:06:59

标签: asp.net-core json.net asp.net-core-2.0 fluentvalidation

在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-80ModelValidator不会运行...

这是因为遵循ASP.NET Core中的验证规则(如果我没有记错的话):

  1. 模型绑定

    返回错误请求,其中包含模型绑定中发生的错误。
    例如,是否无法将2019-40-80绑定到DateTime?属性。

  2. 流动性验证(使用时)

  3. 默认ASP.NET Core

问题出在“ 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创建局部模型?

0 个答案:

没有答案