【问题标题】:Customize swagger schema for a nested type using swashbuckle使用 swashbuckle 为嵌套类型自定义 swagger 模式
【发布时间】:2019-10-01 12:51:23
【问题描述】:

我有一个 api (ASP.NET Core 3.0),它允许用户使用各种查询参数来搜索文档数据库,以过滤和排序结果。其中一个参数是一个Order 参数,它定义了如何对结果进行排序。可接受的值仅限于枚举的值。

我现在需要为枚举添加更多行为,所以我将它重写为Enumeration Class,以便我可以向它添加面向对象的行为。我现在遇到的问题是 Swashbuckle 将 Enumeration 的属性展平,而不是将其保留为单个参数。这是我的枚举和参数类:

// Enumeration
public class DocSearchOrder : Enumeration {
    public static readonly DocSearchOrder DocType = new DocSearchOrder(2, nameof(DocType));
    public static readonly DocSearchOrder DocTypeDesc = new DocSearchOrder(3, nameof(DocTypeDesc));
    public static readonly DocSearchOrder DocDate = new DocSearchOrder(4, nameof(DocDate));
    public static readonly DocSearchOrder DocDateDesc = new DocSearchOrder(5, nameof(DocDateDesc));

    public DocSearchOrder(int value, string name) : base(value, name) {
    }
}

// Search Parameters
public class DocSearchParameters {

    public DocSearchOrder? Order { get; set; }

    // Lots of other search parameters
}

然后是使用它的方法:

public async Task<IActionResult> GetAsync([FromQuery] DocSearchParameters searchParams) {
    // Do the search
}

Swashbuckle 将 searchParams.Order 扁平化为 DocSearchOrder.IdDocSearchOrder.Name。 我想要实现的行为是让我的 Swagger UI 继续显示可用值 (DocSearchOrder.Name) 的下拉列表,用户可以使用名为“Order”的参数从中进行选择。然后,您传递其中一个字符串值,自定义模型绑定器将字符串转换为 Enumeration 类实例。

我尝试编写自定义IOperationFilter,但这似乎只适用于修改传递给GetAsync 方法的类型架构,我无法拦截searchParams.Order 的架构生成。我想我能做的是以某种方式拦截Enumeration 的任何属性的模式生成,并为其生成枚举模式而不是对象模式,但我不知道如何拦截它。

所以我的问题是:有没有办法为嵌套类型自定义模式生成?还是有另一种方法可以解决这个问题而我做错了? :)

【问题讨论】:

    标签: swagger enumeration swashbuckle asp.net-core-3.0


    【解决方案1】:

    常规枚举怎么样:

        public enum DocSearchOrder
        {
            DocType = 2,
            DocTypeDesc = 3,
            DocDate = 4,
            DocDateDesc = 5
        }
    

    我认为那样会更容易,而且应该不会给您带来太多麻烦
    这是我的一个例子:
    http://swagger-net-test.azurewebsites.net/swagger/ui/index?filter=TestEnum#/TestEnum/TestEnum_Get

    【讨论】:

    • 是的,我目前正在使用常规枚举。我想改用 Enumeration 类,这样我就可以向“枚举”成员添加一些额外的功能,而无需依赖一堆 if..else 或 switch 语句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多