ASP.NET Core Web API:配置Swagger为自定义验证属性显示红星
解决Swagger为自定义GuidNotEmpty特性显示红星的问题
要让Swagger识别自定义的GuidNotEmpty特性并显示必填红星,需要通过自定义Schema过滤器告诉Swagger该属性为必填项,具体步骤如下:
1. 实现ISchemaFilter
创建一个Schema过滤器类,扫描属性上的GuidNotEmpty特性,将对应的属性标记为必填:
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Reflection; public class GuidNotEmptySchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (context.Type is null) return; // 获取当前类型的所有公开实例属性 var properties = context.Type.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var property in properties) { // 检查属性是否带有GuidNotEmpty特性 if (property.GetCustomAttribute<GuidNotEmptyAttribute>() != null) { // 适配JsonPropertyName等特性,获取Swagger中实际显示的属性名 var propertyName = context.ApiDescription.ParameterDescriptions .FirstOrDefault(p => p.Name == property.Name)? .Name ?? property.Name; if (schema.Properties.TryGetValue(propertyName, out var propertySchema)) { // 标记属性为必填 propertySchema.Required = true; // 将属性名加入Schema的必填集合 if (!schema.Required.Contains(propertyName)) { schema.Required.Add(propertyName); } } } } } }
2. 注册Schema过滤器到Swagger服务
在Program.cs的Swagger配置中,添加这个自定义过滤器:
builder.Services.AddSwaggerGen(c => { // 其他Swagger配置(如文档标题、版本等) c.SchemaFilter<GuidNotEmptySchemaFilter>(); });
3. 可选:补充属性描述(可选)
如果需要在Swagger的属性说明里体现自定义验证规则,可以在Schema过滤器中补充描述,或者直接给GuidNotEmptyAttribute添加SwaggerSchema特性:
// 方式1:在过滤器中添加描述 propertySchema.Description += " (不能为Guid.Empty)"; // 方式2:给自定义特性添加SwaggerSchema特性 [AttributeUsage(AttributeTargets.Property)] [SwaggerSchema(Description = "不能为Guid.Empty的必填值")] public class GuidNotEmptyAttribute : ValidationAttribute { // 原有验证逻辑... }
完成以上配置后,带有[GuidNotEmpty]特性的Guid属性,在Swagger的Schema中就会显示必填红星,同时后端的空Guid验证逻辑依然正常生效。
内容的提问来源于stack exchange,提问作者Milad Ahmadi
相关产品推荐
相关产品推荐

