如何在 Web dto 架构内的 swagger ui 中显示自定义验证属性

Sta*_*tam 6 swagger swagger-ui .net-core swashbuckle.aspnetcore

在 .NET Core 3.1 api 项目中,我集成了 swagger ui。

在 swagger ui 的 Web dto 模式中,我可以看到基本数据注释属性(如RequiredStringLength)已应用于属性以进行验证。

如果自定义属性已应用于 Web dto 的属性,我还想显示该属性。

例如:

public class AttachmentGetInfoWebDto
{

    [IsNewerThan(minYear: 1928, "You cannot select an attachment older than 1928")]
    public int FromYear { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果我可以向 的示意图显示AttachmentGetInfoWebDto您不允许传递FromYear小于该属性的值,那就太好了1928。这可能吗?

小智 3

你可以这样做:

创建自定义验证属性,例如 UniqueAttribute

public class UniqueAttribute : ValidationAttribute { ... }
Run Code Online (Sandbox Code Playgroud)

将此属性应用于模型属性

[Unique]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

实现 ISchemaFilter 接口扩展

public class AddUniquenessDescriptionFilter : ISchemaFilter
{
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
var attr = context.MemberInfo?.CustomAttributes.Where(x => 
     x.AttributeType.Name == nameof(UniqueAttribute)) 
     .FirstOrDefault();

if (attr is not null)
{
  schema.Extensions.Add("isUnique", new OpenApiBoolean(true));
}
}
}
Run Code Online (Sandbox Code Playgroud)

并在启动时使用扩展

builder.Services.AddSwaggerGen(options => 
{ 
options.SchemaFilter<AddUniquenessDescriptionFilter>(); 
});
Run Code Online (Sandbox Code Playgroud)