【发布时间】: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.Id 和 DocSearchOrder.Name。
我想要实现的行为是让我的 Swagger UI 继续显示可用值 (DocSearchOrder.Name) 的下拉列表,用户可以使用名为“Order”的参数从中进行选择。然后,您传递其中一个字符串值,自定义模型绑定器将字符串转换为 Enumeration 类实例。
我尝试编写自定义IOperationFilter,但这似乎只适用于修改传递给GetAsync 方法的类型架构,我无法拦截searchParams.Order 的架构生成。我想我能做的是以某种方式拦截Enumeration 的任何属性的模式生成,并为其生成枚举模式而不是对象模式,但我不知道如何拦截它。
所以我的问题是:有没有办法为嵌套类型自定义模式生成?还是有另一种方法可以解决这个问题而我做错了? :)
【问题讨论】:
标签: swagger enumeration swashbuckle asp.net-core-3.0