You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET接口JSON字段校验:如何返回具体错误信息?

实现ASP.NET Core接口详细模型验证错误提示

问题背景

你有一个ASP.NET Core的Patch接口,接收UpdateFormRequest模型作为请求体,但当前当输入JSON格式或字段不符合要求时,仅返回模糊的“预期为updateFormRequest”错误,需要返回具体的字段缺失或格式错误提示,且无需手动逐个校验字段。

解决方案

以下两种方式都能自动生成详细的验证错误,无需手动编写字段校验逻辑:


方案1:利用内置模型验证+自定义错误响应

ASP.NET Core自带模型绑定验证机制,只需配置自定义响应格式,即可返回详细错误:

  1. 给模型添加数据注解(可选,用于自定义错误提示)
    针对UpdateFormRequest的必填字段或格式要求,添加数据注解:

    using System.ComponentModel.DataAnnotations;
    
    public class UpdateFormRequest
    {
        [Required(ErrorMessage = "Id字段不能为空")]
        public Guid Id { get; set; }
        // 若ArrivalTime是时间格式,可添加格式验证
        [RegularExpression(@"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$", ErrorMessage = "ArrivalTime必须为yyyy-MM-dd HH:mm:ss格式")]
        public string? ArrivalTime { get; set; }
        public string? Val1 { get; set; }
        public string? Val2 { get; set; }
    }
    
  2. 配置全局错误响应格式
    在Program.cs中配置ApiBehaviorOptions,将模型验证错误转换为结构化的详细响应:

    builder.Services.Configure<ApiBehaviorOptions>(options =>
    {
        options.InvalidModelStateResponseFactory = context =>
        {
            var detailedErrors = context.ModelState
                .Where(kv => kv.Value.Errors.Any())
                .SelectMany(kv => kv.Value.Errors)
                .Select(err => err.ErrorMessage)
                .ToList();
    
            var errorResponse = new
            {
                Code = StatusCodes.Status400BadRequest,
                Message = "请求参数验证失败",
                DetailedErrors = detailedErrors
            };
    
            return new BadRequestObjectResult(errorResponse);
        };
    });
    

方案2:使用FluentValidation实现更灵活的验证

如果需要更复杂的验证规则,FluentValidation是更灵活的选择,同样无需手动校验:

  1. 安装依赖包
    通过NuGet安装FluentValidation.AspNetCore。

  2. 创建模型验证器
    编写UpdateFormRequest的验证规则:

    using FluentValidation;
    
    public class UpdateFormRequestValidator : AbstractValidator<UpdateFormRequest>
    {
        public UpdateFormRequestValidator()
        {
            // Id不能为空且必须是有效Guid(非空Guid)
            RuleFor(req => req.Id)
                .NotEmpty().WithMessage("Id不能为空")
                .Must(guid => guid != Guid.Empty).WithMessage("Id必须是有效的Guid值");
    
            // ArrivalTime非空时必须符合指定时间格式
            RuleFor(req => req.ArrivalTime)
                .Matches(@"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$")
                .WithMessage("ArrivalTime必须为yyyy-MM-dd HH:mm:ss格式")
                .When(req => !string.IsNullOrEmpty(req.ArrivalTime));
    
            // 可根据需求添加其他字段的验证规则
        }
    }
    
  3. 注册验证服务
    在Program.cs中注册FluentValidation服务:

    builder.Services.AddFluentValidationAutoValidation();
    builder.Services.AddFluentValidationClientsideAdapters();
    builder.Services.AddScoped<IValidator<UpdateFormRequest>, UpdateFormRequestValidator>();
    

效果说明

配置完成后,当请求参数不符合要求时,接口会返回包含具体错误信息的响应,例如:

{
  "Code": 400,
  "Message": "请求参数验证失败",
  "DetailedErrors": [
    "Id必须是有效的Guid值",
    "ArrivalTime必须为yyyy-MM-dd HH:mm:ss格式"
  ]
}

内容的提问来源于stack exchange,提问作者Adrian Gil Moral

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:25:15