对于最小API来说相当于ConfigureApiBehaviorOptions()

问题描述 投票:0回答:1

在 ASP.NET Core 应用程序中,如果您使用

AddMvc()
AddControllers()
,您可以配置默认行为,以防输入 DTO 无效,例如:

services.AddControllers()
    .ConfigureApiBehaviorOptions(options => {
        options.InvalidModelStateResponseFactory = ctx => {
            return new UnprocessableEntityResult();
        };
    });

这样,每当 mvc 系统发现输入 DTO 导致无效的 ModelState 时,就会返回上述错误,而无需在每个控制器的方法中都执行此操作:

if (!ModelState.IsValid) {
    return new UnprocessableEntityResult();
}

有没有办法使用

ModelState
或类似的方法来集中管理 ASP.NET Core Minimal API 中的 ModelState 错误或其他问题?

c# asp.net-core asp.net-core-webapi minimal-apis
1个回答
0
投票

不,开箱即用的最小 API 没有

ModelState
之类的东西。您将需要推出自己的库或使用一些第三方库:

  1. 利用
    System.ComponentModel.DataAnnotations.Validator
    (例如这里)可以处理相应的属性。
  2. FluentValidation
    图书馆
  3. MiniValidation
    图书馆

您可以“内联”使用它(即创建/解析验证器并在最小 API 处理程序中使用它)。例如对于

FluentValidation

app.MapPost("/person", async (IValidator<Person> validator, IPersonRepository repository, Person person) => 
{
  ValidationResult validationResult = await validator.ValidateAsync(person);

  if (!validationResult.IsValid) 
  {
    return Results.ValidationProblem(validationResult.ToDictionary());
  }

  repository.Save(person);
  return Results.Created($"/{person.Id}", person);
});

这当然会变得很麻烦,但是您可以使用Minimal API的过滤器来克服这个问题,或者通过推出您自己的过滤器,就像这个答案中那样(请注意,您可以使用Route推出“全局”过滤器)团体)。

或者您可以使用另一个第三方库,例如 O9d.AspNet.FluentValidation ,它实现了此功能:

var group = app.MapGroup("/")
    .WithValidationFilter();
© www.soinside.com 2019 - 2024. All rights reserved.