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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:03:39