首页 > 解决方案 > 在单个 BadRequest 中返回模型绑定错误和流利验证错误

问题描述

在 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. Model Binding ”中,其中使用[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 来创建部分模型?

标签: asp.net-corejson.netasp.net-core-2.0fluentvalidation

解决方案


推荐阅读