You need to enable JavaScript to run this app. .NET Core Web API中属性Display Name注解不生效如何解决
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core Web API中属性Display Name注解不生效如何解决

问题原因说明

[Display(Name = "First Name")] 是 ASP.NET Core 内置的 UI 相关特性,仅作用于 Razor 视图渲染、表单校验提示等前端展示场景,和JSON序列化逻辑完全无关,自然不会影响接口返回的字段名。

你当前加的[JsonProperty("name")]是Newtonsoft.Json的序列化特性,会同时控制序列化、反序列化的字段映射:

  1. 反序列化Mongo返回的name字段到FirstName属性是正常的
  2. 但序列化返回接口响应时,也会输出name字段

另外你返回结果中LastName字段没有按你标注的[JsonProperty("lastName")]输出,说明你的项目默认用的是.NET Core 3.0+内置的System.Text.Json序列化器,默认不识别Newtonsoft.Json的特性。


解决方案

方案1:分层实现(最推荐,无版本依赖、逻辑清晰)

不要直接把数据库查询用的实体类作为接口返回值,单独定义接口响应的DTO(数据传输对象),数据库实体和DTO分开映射,完全隔离两层的字段配置:

  1. 原有数据库实体类UserDetails保持不变,保证Mongo反序列化逻辑正常
  2. 新增接口返回DTO类:
// 如果你用默认System.Text.Json序列化器
using System.Text.Json.Serialization;

public class UserDetailsRespDto
{
    [JsonPropertyName("First Name")]
    public string FirstName { get; set; }

    [JsonPropertyName("Last Name")]
    public string LastName { get; set; }

    [JsonPropertyName("Designation")]
    public string Designation { get; set; }
}
  1. 查询到UserDetails对象后,手动赋值或者用AutoMapper映射为UserDetailsRespDto再返回给接口即可。

方案2:同实体类区分序列化/反序列化配置

如果你不想新增DTO,可根据你用的序列化器调整配置:

场景A:用默认System.Text.Json(.NET 7及以上版本)

.NET 7 开始System.Text.Json支持分别指定序列化、反序列化的字段名,直接替换原有特性即可:

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

public class UserDetails
{
    [JsonDeserializedName("name")] // 反序列化时识别Mongo返回的name字段
    [JsonSerializedName("First Name")] // 序列化返回时输出First Name
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [JsonDeserializedName("lastName")]
    [JsonSerializedName("Last Name")]
    public string LastName { get; set; }

    [JsonDeserializedName("designation")]
    [JsonSerializedName("Designation")]
    public string Designation { get; set; }
}
场景B:用Newtonsoft.Json作为序列化器

先确保已接入Newtonsoft.Json:

  1. 安装NuGet包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. 在Program.cs(.NET 6+)中注册配置:
builder.Services.AddControllers()
    .AddNewtonsoftJson();

修改模型类特性:

using Newtonsoft.Json;
using System.ComponentModel.DataAnnotations;

public class UserDetails
{
    [JsonProperty("name")] // 控制反序列化
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [JsonProperty("lastName")]
    public string LastName { get; set; }

    [JsonProperty("designation")]
    public string Designation { get; set; }

    // 禁止原属性序列化
    public bool ShouldSerializeFirstName() => false;
    // 新增序列化输出的属性
    [JsonProperty("First Name")]
    public string FirstNameOutput => FirstName;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 17:15:09