ModelState 验证

参考文档:

处理 ASP.NET Core Web API 中的错误 | Microsoft Docs

使用 ASP.NET Core 创建 Web API | Microsoft Docs

 

关于如何输出自定义的验证结果

方式一,直接禁用,然后自己写输出

如下所示,将 SuppressModelStateInvalidFilter  设置为true,

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
    });

接着,就可以在Action中写逻辑

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}

或者自定义一个filter,在filter里面写逻辑,(注:filter可以全局注入或者写在Action上)

public class OutputJsonErrorFilter : IActionFilter
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new JsonResult(APIResult.CreateError(0, error));
            ....
        }
    }
}

方式二,改写默认行为处理

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.InvalidModelStateResponseFactory = context =>
            new BadRequestObjectResult(context.ModelState)
            {
                ContentTypes =
                {
                    // using static System.Net.Mime.MediaTypeNames;
                    Application.Json,
                    Application.Xml
                }
            };
    })
    .AddXmlSerializerFormatters();