You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中如何实现用+分隔查询字符串数组参数并适配Swagger?

在ASP.NET Core中实现简洁的字符串集合查询参数传递

当然可以实现这种简洁的参数传递方式,下面提供几种实用方案:

方案一:直接使用字符串参数自行拆分(最简单)

把参数类型从string[]改成string,在方法内部手动按分隔符拆分:

[ApiController]
[Route("api/v1/[controller]")]
public class CombinationsController : ControllerBase
{
    [HttpGet]
    public async Task<IActionResult> Get([FromQuery] string letters)
    {
        if (string.IsNullOrWhiteSpace(letters))
        {
            return BadRequest("请提供字母参数");
        }
        // 按加号拆分,也可以换成逗号','
        string[] letterArray = letters.Split('+', StringSplitOptions.RemoveEmptyEntries);
        
        // 后续业务逻辑:查询数据库匹配的单词
        return Ok(letterArray);
    }
}

这种方式无需额外配置,直接就能接收api/v1/combinations?letters=d+g+o格式的请求。注意:URL中的+会被解析为空格,如果需要传递实际的加号,建议改用逗号分隔(比如letters=d,g,o),避免编码问题。

方案二:自定义模型绑定器(更灵活)

如果想保留string[]参数类型,同时支持分隔符格式,可以自定义模型绑定器:

1. 创建模型绑定器类

public class StringArrayModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException(nameof(bindingContext));

        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult == ValueProviderResult.None)
            return Task.CompletedTask;

        var rawValue = valueProviderResult.FirstValue;
        if (string.IsNullOrWhiteSpace(rawValue))
        {
            bindingContext.Result = ModelBindingResult.Success(Array.Empty<string>());
            return Task.CompletedTask;
        }

        // 支持加号或逗号分隔,可根据需求调整
        var array = rawValue.Split(new[] { '+', ',' }, StringSplitOptions.RemoveEmptyEntries);
        bindingContext.Result = ModelBindingResult.Success(array);
        return Task.CompletedTask;
    }
}

2. 在控制器参数上绑定

[ApiController]
[Route("api/v1/[controller]")]
public class CombinationsController : ControllerBase
{
    [HttpGet]
    public async Task<IActionResult> Get(
        [FromQuery, ModelBinder(BinderType = typeof(StringArrayModelBinder))] string[] letters)
    {
        if (letters == null || letters.Length == 0)
        {
            return BadRequest("请提供字母参数");
        }
        
        // 后续业务逻辑
        return Ok(letters);
    }
}

这样既支持letters=d+g+o,也支持letters=d,g,o,同时保留了数组参数的类型。

方案三:配置Swagger显示正确的参数格式

如果希望Swagger能生成符合预期的参数示例(而不是重复的letters=),可以添加Swashbuckle的自定义过滤器:

1. 创建操作过滤器

public class StringArrayQueryFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var parametersToModify = operation.Parameters
            .Where(p => p.Name == "letters" && p.Schema.Type == "array")
            .ToList();

        foreach (var param in parametersToModify)
        {
            // 修改参数类型为字符串,描述分隔方式
            param.Schema.Type = "string";
            param.Schema.Format = null;
            param.Description = "用加号(+)或逗号(,)分隔的字母列表,例如:d+g+o 或 d,g,o";
            param.Example = new OpenApiString("d+g+o");
        }
    }
}

2. 在Program.cs中注册过滤器

builder.Services.AddSwaggerGen(c =>
{
    c.OperationFilter<StringArrayQueryFilter>();
});

配置后,Swagger会显示单个letters参数,示例为d+g+o,更符合你的需求。

内容的提问来源于stack exchange,提问作者JansthcirlU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:13:59