Asp.net-Core

Swagger Swashbuckle Asp.NET Core:顯示使用的每個列舉的詳細資訊

  • September 16, 2021

我有以下列舉:

public enum TicketQuestionType
{
   General = 1,
   Billing = 2,
   TMS = 3,
   HOS = 4,
   DeviceManagement = 5
}

和模型類:

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 方法使用它:

Task<IActionResult> Create(TicketCreateApi model);

Swagger 生成以下內容:

在此處輸入圖像描述

和這個:

在此處輸入圖像描述

因此,我們只能看到預設值,而無法看到可用的列舉列表(名稱和值)。我想展示它。怎麼做?

我們只能看到預設值,無法看到可用的列舉列表(名稱和值)。我想展示它。怎麼做?

要在 swagger 中將列舉顯示為字元串,請配置 JsonStringEnumConverter,在 ConfigureServices 中添加以下行:

       services.AddControllers().AddJsonOptions(options =>
           options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));

輸出如下:

在此處輸入圖像描述

如果要將列舉顯示為 stings 和 int 值,可以嘗試創建一個 EnumSchemaFilter 來更改架構。程式碼如下:

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。

       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>();
       });

結果是這樣的:

在此處輸入圖像描述

引用自:https://stackoverflow.com/questions/65312198