首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swashbuckle Asp.NET核心:显示使用每个枚举的详细信息

Swashbuckle Asp.NET核心:显示使用每个枚举的详细信息
EN

Stack Overflow用户
提问于 2020-12-15 19:07:51
回答 2查看 7.9K关注 0票数 10

我有以下内容:

代码语言:javascript
运行
复制
public enum TicketQuestionType
{
    General = 1,
    Billing = 2,
    TMS = 3,
    HOS = 4,
    DeviceManagement = 5
}

和示范班:

代码语言:javascript
运行
复制
public class TicketCreateApi
{
    public string Subject { get; set; }
    public TicketQuestionType QuestionType { get; set; } = TicketQuestionType.General;
    public TicketType Type { get; set; } = TicketType.Problem;
    public TicketStatus Status { get; set; } = TicketStatus.New;
    public TicketPriority Priority { get; set; } = TicketPriority.Normal;
    public string Description { get; set; }
    public List<string> Attachments { get; set; }
    public int? DeviceId { get; set; }
    public int? DriverId { get; set; }
}

我的API方法使用它:

代码语言:javascript
运行
复制
Task<IActionResult> Create(TicketCreateApi model);

Swagger生成以下内容:

这是:

因此,我们只能看到默认值,而无法看到可用的枚举列表(名称和值)。我想展示给你看。该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-16 06:46:36

,我们只能看到默认值,无法看到可用的枚举列表(名称和值)。我想展示给你看。该怎么做呢?

要在swagger中将枚举显示为字符串,可以配置JsonStringEnumConverter,在ConfigureServices中添加以下行:

代码语言:javascript
运行
复制
        services.AddControllers().AddJsonOptions(options =>
            options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));

产出如下:

如果要将枚举显示为刺和int值,可以尝试创建一个EnumSchemaFilter来更改架构。守则如下:

代码语言:javascript
运行
复制
public class EnumSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema model, SchemaFilterContext context)
    {
        if (context.Type.IsEnum)
        {
            model.Enum.Clear();
            Enum.GetNames(context.Type)
                .ToList()
                .ForEach(name => model.Enum.Add(new OpenApiString($"{Convert.ToInt64(Enum.Parse(context.Type, name))} = {name}")));
        }
    }
}

将SwaggerGen配置为使用上面的ShemaFilter。

代码语言:javascript
运行
复制
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo
            {
                Version = "v1",
                Title = "ToDo API",
                Description = "A simple example ASP.NET Core Web API",
                TermsOfService = new Uri("https://example.com/terms"),
                Contact = new OpenApiContact
                {
                    Name = "Shayne Boyer",
                    Email = string.Empty,
                    Url = new Uri("https://twitter.com/spboyer"),
                },
                License = new OpenApiLicense
                {
                    Name = "Use under LICX",
                    Url = new Uri("https://example.com/license"),
                }
            });
              
            c.SchemaFilter<EnumSchemaFilter>();
        });

结果如下:

票数 25
EN

Stack Overflow用户

发布于 2021-09-16 07:25:01

我试过EnumSchemaFilter。每次我提交请求时都会出错。因为将枚举字符串序列化为int

我使用了这个代码块,我希望它能工作。

代码语言:javascript
运行
复制
services.AddControllersWithViews()
                    .AddJsonOptions(
                        opts =>
                        {
                            var enumConverter = new JsonStringEnumConverter();
                            opts.JsonSerializerOptions.Converters.Add(enumConverter);
                        });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65312198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档