ABP Framework中如何让DTO的Id返回小写id(不修改基类)
解决ABP Framework中DTO的Id属性返回小写"id"的问题
方案一:在DTO中覆盖Id属性并添加特性(推荐,符合你说的装饰器思路)
直接在CountryDto中显式覆盖基类的Id属性,通过DataMember(适配DataContract序列化)和Json序列化特性(适配API的Json输出)指定属性名为小写的id,这样所有端点都会统一返回id,而非仅OData端点。
代码示例:
[DataContract] public class CountryDto : FullAuditedEntityDto<Guid> { // 覆盖基类Id属性,指定序列化后的名称为"id" [DataMember(Name = "id")] [JsonProperty("id")] // 适配Newtonsoft.Json(ABP默认) [JsonPropertyName("id")] // 适配System.Text.Json(若项目已切换) public override Guid Id { get; set; } [DataMember(Name = "user_name")] public string Name { get; set; } }
方案二:全局序列化配置(批量处理所有DTO)
如果你希望所有继承自EntityDto或FullAuditedEntityDto的DTO的Id都统一返回小写id,可以通过ABP的Json配置全局修改命名策略:
在模块的ConfigureServices方法中添加配置:
public override void ConfigureServices(ServiceConfigurationContext context) { Configure<AbpJsonOptions>(options => { options.JsonSerializerSettings.ContractResolver = new DefaultContractResolver { NamingStrategy = new CustomIdNamingStrategy() }; }); } // 自定义命名策略,将所有"Id"属性转为"id" public class CustomIdNamingStrategy : CamelCaseNamingStrategy { protected override string ResolvePropertyName(string propertyName) { return propertyName.Equals("Id", StringComparison.Ordinal) ? "id" : base.ResolvePropertyName(propertyName); } }
为什么这个方案比OData配置更优
你之前用OData构建器的配置仅对OData端点生效,而上述两种方案(尤其是方案一的特性装饰方式)会作用于所有序列化场景:包括普通REST API、DTO的序列化输出、甚至客户端的反序列化逻辑,确保全链路的属性名统一。
内容的提问来源于stack exchange,提问作者Heitor Giacomini
相关产品推荐
相关产品推荐

