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

ASP.NET Core Web API数据类型错误时自定义错误消息

自定义ASP.NET Core Web API数据类型错误返回消息

方法一:全局异常过滤器处理Json转换错误

这种方式可以统一处理所有接口的Json数据类型转换错误,无需逐个属性配置。

步骤1:创建自定义异常过滤器

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Text.Json;

public class JsonValidationFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        if (context.Exception is JsonException jsonEx)
        {
            // 解析Json路径,提取字段名(如从$.name提取Name)
            var propertyName = ParsePropertyName(jsonEx.Path);
            // 自定义错误消息,可根据字段名设置不同提示
            var errorMessage = propertyName.Equals("Name", StringComparison.OrdinalIgnoreCase) 
                ? "名称必须为字符串类型" 
                : $"字段{propertyName}的数据类型不正确";

            // 构造自定义验证错误响应
            var validationProblem = new ValidationProblemDetails
            {
                Status = StatusCodes.Status400BadRequest,
                Title = "请求数据格式错误",
                Errors = new Dictionary<string, string[]>
                {
                    { propertyName, new[] { errorMessage } }
                }
            };

            context.Result = new BadRequestObjectResult(validationProblem);
            context.ExceptionHandled = true;
        }
    }

    private string ParsePropertyName(string jsonPath)
    {
        if (string.IsNullOrWhiteSpace(jsonPath)) return string.Empty;
        // 处理$.name格式的路径,提取字段名并首字母大写
        var parts = jsonPath.Split('.');
        var fieldName = parts.Length > 1 ? parts[1] : jsonPath;
        return char.ToUpper(fieldName[0]) + fieldName[1..];
    }
}

步骤2:注册过滤器到全局

在Program.cs中添加过滤器配置:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    // 添加自定义Json验证过滤器
    options.Filters.Add<JsonValidationFilter>();
});

// ...其他配置

var app = builder.Build();

// ...中间件配置

app.MapControllers();

app.Run();

方法二:针对特定属性使用自定义Json转换器

如果只需要给个别字段做类型校验和自定义提示,可以用这种方式,直接在模型属性上配置转换器。

步骤1:创建自定义字符串转换器

using System.Text.Json;
using System.Text.Json.Serialization;

public class StrictStringConverter : JsonConverter<string>
{
    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 仅接受字符串类型,否则抛出自定义错误
        if (reader.TokenType != JsonTokenType.String)
        {
            throw new JsonException("名称必须是字符串类型");
        }
        return reader.GetString() ?? string.Empty;
    }

    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value);
    }
}

步骤2:在模型属性上应用转换器

修改UpdateNameData类:

using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;

public class UpdateNameData
{
    [Required(ErrorMessage = "名称为必填项")]
    [JsonConverter(typeof(StrictStringConverter))]
    public string Name { get; set; } = string.Empty;
}

效果验证

发送请求{ "name": 1 }后,会返回自定义错误响应:

{
  "title": "请求数据格式错误",
  "status": 400,
  "errors": {
    "Name": [
      "名称必须为字符串类型"
    ]
  },
  "traceId": "..."
}

内容的提问来源于stack exchange,提问作者user18003912

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:12:36