In a .NET Core 3.1 api project I have integrated swagger ui.
In a web dto schema in the swagger ui, I am able to see that a basic data annotation attribute (like Required
, StringLength
etc. ) has been applied to a property for validation.
I would like to display as well a custom attribute if this has been applied to a property of a web dto.
For example:
public class AttachmentGetInfoWebDto
{
[IsNewerThan(minYear: 1928, "You cannot select an attachment older than 1928")]
public int FromYear { get; set; }
}
It would be great if I could display to the shema of the AttachmentGetInfoWebDto
that you are not allow ed to pass a value for the property FromYear
less that 1928
. Is this possible?
You can do it like this:
Create custom validation attribute, for example UniqueAttribute
public class UniqueAttribute : ValidationAttribute { ... }
Apply this attribute to a model property
[Unique]
public string Name { get; set; }
Implement ISchemaFilter interface extension
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));
}
}
}
And use extension on startup
builder.Services.AddSwaggerGen(options =>
{
options.SchemaFilter<AddUniquenessDescriptionFilter>();
});