.NET Core Web API中属性Display Name注解不生效如何解决
问题原因说明
[Display(Name = "First Name")] 是 ASP.NET Core 内置的 UI 相关特性,仅作用于 Razor 视图渲染、表单校验提示等前端展示场景,和JSON序列化逻辑完全无关,自然不会影响接口返回的字段名。
你当前加的[JsonProperty("name")]是Newtonsoft.Json的序列化特性,会同时控制序列化、反序列化的字段映射:
- 反序列化Mongo返回的
name字段到FirstName属性是正常的 - 但序列化返回接口响应时,也会输出
name字段
另外你返回结果中LastName字段没有按你标注的[JsonProperty("lastName")]输出,说明你的项目默认用的是.NET Core 3.0+内置的System.Text.Json序列化器,默认不识别Newtonsoft.Json的特性。
解决方案
方案1:分层实现(最推荐,无版本依赖、逻辑清晰)
不要直接把数据库查询用的实体类作为接口返回值,单独定义接口响应的DTO(数据传输对象),数据库实体和DTO分开映射,完全隔离两层的字段配置:
- 原有数据库实体类
UserDetails保持不变,保证Mongo反序列化逻辑正常 - 新增接口返回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; } }
- 查询到
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:
- 安装NuGet包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在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
相关产品推荐
相关产品推荐

