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

.NET Core中如何统一兼容两种格式的数组查询参数?

统一支持两种ID列表查询格式的方案

方案一:直接在Action中处理(简洁快速)

无需额外自定义组件,直接通过Request.Query获取所有同名参数值,合并逗号分隔的内容即可:

public ActionResult GetByIds()
{
    var idList = new List<string>();
    // 获取所有名为"ids"的查询参数值
    var idParams = Request.Query["ids"];
    
    foreach (var paramValue in idParams)
    {
        if (!string.IsNullOrWhiteSpace(paramValue))
        {
            // 分割逗号分隔的ID并添加到列表
            idList.AddRange(paramValue.Split(',', StringSplitOptions.RemoveEmptyEntries));
        }
    }

    // 此处编写idList的业务处理逻辑
    return Ok(idList);
}

该方式直接适配两种请求格式:

  • /users?ids=abc123,def4141,ggg555:单个参数值会被分割为3个ID
  • /users?ids=abce123&ids=def4141&ids=ggg555:多个参数值直接被收集为3个ID

方案二:自定义模型绑定器(优雅复用)

如果多个Action都需要支持这种格式,推荐自定义模型绑定器实现全局复用:

1. 实现模型绑定器

public class CommaSeparatedListBinder : 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;

        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);

        var idList = new List<string>();
        foreach (var paramValue in valueProviderResult.ToArray())
        {
            if (!string.IsNullOrWhiteSpace(paramValue))
            {
                idList.AddRange(paramValue.Split(',', StringSplitOptions.RemoveEmptyEntries));
            }
        }

        bindingContext.Result = ModelBindingResult.Success(idList);
        return Task.CompletedTask;
    }
}

2. 注册绑定器提供程序

public class CommaSeparatedListBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context == null)
            throw new ArgumentNullException(nameof(context));

        if (context.Metadata.ModelType == typeof(List<string>))
        {
            return new BinderTypeModelBinder(typeof(CommaSeparatedListBinder));
        }

        return null;
    }
}

3. 在配置中启用绑定器

在Program.cs中将自定义绑定器添加到MVC选项:

builder.Services.AddControllers(options =>
{
    // 插入到绑定器列表最前面,优先使用自定义逻辑
    options.ModelBinderProviders.Insert(0, new CommaSeparatedListBinderProvider());
});

4. 在Action中使用

直接用List<string>接收参数,两种格式会自动适配:

public ActionResult GetByIds(List<string> ids)
{
    // 编写ids列表的业务处理逻辑
    return Ok(ids);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:25:30