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

如何通过Swashbuckle实现SwaggerUI中Entities标签的嵌套控制器结构

实现SwaggerUI的Entities层级展示方案

要实现「Entities->控制器->API方法」的嵌套层级结构,核心是让SwaggerUI识别标签的层级关系,通过自定义操作过滤器批量设置带层级前缀的标签即可解决,具体步骤如下:

1. 自定义操作过滤器(批量设置层级标签)

创建一个IOperationFilter实现类,自动给每个API操作添加带父标签前缀的标签:

using Microsoft.AspNetCore.Mvc.Controllers;
using Swashbuckle.AspNetCore.SwaggerGen;
using Microsoft.OpenApi.Models;

public class EntityHierarchyTagFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        // 获取控制器名称(自动去除Controller后缀)
        var controllerName = context.ApiDescription.ActionDescriptor is ControllerActionDescriptor descriptor
            ? descriptor.ControllerName.Replace("Controller", "")
            : "UnknownController";

        // 清空默认标签,添加层级标签(用|作为层级分隔符)
        operation.Tags.Clear();
        operation.Tags.Add(new OpenApiTag { Name = $"Entities|{controllerName}" });
    }
}

2. 注册过滤器到SwaggerGen

在Program.cs的Swagger配置中注册这个过滤器:

builder.Services.AddSwaggerGen(c =>
{
    // 保留你原有的Swagger配置(比如文档信息、XML注释等)
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });

    // 注册自定义层级标签过滤器
    c.OperationFilter<EntityHierarchyTagFilter>();
});

3. 配置SwaggerUI识别层级分隔符

默认SwaggerUI支持用|作为标签层级分隔符,若需要显式指定或调整,可在SwaggerUI配置中添加:

app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    // 显式指定标签层级分隔符(可选,默认已支持|)
    c.TagSelectorSeparator("|");
    // 可选:设置默认展开状态,比如None是全部折叠,List是展开标签层级
    c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.List);
});

4. 可选:灵活控制哪些控制器加入Entities层级

如果不是所有控制器都需要放到Entities下,可以通过自定义特性来筛选:

第一步:定义标记特性

[AttributeUsage(AttributeTargets.Class)]
public class EntityGroupAttribute : Attribute
{
    // 可自定义父组名称,默认是Entities
    public string ParentGroupName { get; } = "Entities";
}

第二步:给目标控制器添加特性

[EntityGroup]
public class EmployeesController : ControllerBase
{
    // API方法...
}

[EntityGroup]
public class ProductsController : ControllerBase
{
    // API方法...
}

第三步:修改过滤器适配特性

public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
    var controllerDescriptor = context.ApiDescription.ActionDescriptor as ControllerActionDescriptor;
    if (controllerDescriptor == null) return;

    // 只处理标记了EntityGroup特性的控制器
    var groupAttr = controllerDescriptor.ControllerTypeInfo.GetCustomAttribute<EntityGroupAttribute>();
    if (groupAttr == null) return;

    var controllerName = controllerDescriptor.ControllerName.Replace("Controller", "");
    operation.Tags.Clear();
    operation.Tags.Add(new OpenApiTag { Name = $"{groupAttr.ParentGroupName}|{controllerName}" });
}

原理说明

之前直接设置所有方法的Tag为Entities,导致所有API都平铺在同一个标签下;而通过给标签添加父标签|子标签的格式,SwaggerUI会自动解析分隔符,将子标签嵌套到父标签下,从而实现你需要的层级结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:37:40