.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
相关产品推荐
相关产品推荐

