我有一个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继续显示用户可以使用名为“ Order”的参数选择的可用值(DocSearchOrder.Name
)的下拉列表。然后,您传递这些字符串值之一,然后自定义模型绑定程序将字符串转换为Enumeration类实例。
我曾尝试编写自定义IOperationFilter
,但这似乎仅对修改传递给GetAsync
方法的类型的模式有效,我无法拦截searchParams.Order
的模式生成。我以为我可以做的是以某种方式拦截任何为Enumeration
的属性的模式生成,并为其生成枚举模式而不是对象模式,但是我不知道如何对其进行拦截。 >
所以我的问题是:有没有一种方法可以为嵌套类型自定义架构生成?还是有另一种方法可以解决这个问题,而我做错了一切? :)
我有一个api(ASP.NET Core 3.0),允许用户使用各种查询参数来搜索文档数据库以筛选和排序结果。参数之一是Order参数,该参数是...
常规枚举如何: