在 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 错误或其他问题?
不,开箱即用的最小 API 没有
ModelState
之类的东西。您将需要推出自己的库或使用一些第三方库:
System.ComponentModel.DataAnnotations.Validator
(例如这里)可以处理相应的属性。FluentValidation
图书馆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();