ASP.NET Core 8 Web API:如何以逗号分隔传入int数组至控制器方法
解决方案:ASP.NET Core 8 支持逗号分隔的QueryString数组绑定
你可以通过轻量级类型转换器实现需求,无需编写完整自定义模型绑定器,也不用手动将字符串转数组,完全贴近原生体验:
方法1:局部生效(仅针对单个参数)
- 定义一个极简的类型转换器(代码量远少于完整模型绑定器):
public class CsvIntArrayConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string csvString) { return string.IsNullOrEmpty(csvString) ? Array.Empty<int>() : csvString.Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(int.Parse) .ToArray(); } return base.ConvertFrom(context, culture, value); } }
- 在控制器参数上添加
[TypeConverter]特性:
[HttpGet("{storeId:int}")] public async Task<IActionResult> Index( int storeId, int requiredQuantity, [FromQuery, TypeConverter(typeof(CsvIntArrayConverter))] int[] plus) { try { // 业务逻辑实现 return Ok(response); } catch (Exception ex) { return StatusCode(500, new { message = "处理请求时发生错误,请稍后重试。" }); } }
方法2:全局生效(所有int[]类型的Query参数自动支持)
如果多个接口都需要这个功能,可在启动时全局注册转换器,无需逐个参数添加特性:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddMvcOptions(options => { // 为int[]类型注册CSV转换逻辑 TypeDescriptor.AddAttributes(typeof(int[]), new TypeConverterAttribute(typeof(CsvIntArrayConverter))); }); var app = builder.Build(); // 中间件配置... app.Run();
效果说明
配置完成后,两种调用方式都能正常解析:
- 原有多参数方式:
GET https://localhost:44385/test/test/650?plus=13&plus=4412&plus=4099&requiredQuantity=41 - 新的逗号分隔方式:
GET https://localhost:44385/test/test/650?plus=13,4412,4099&requiredQuantity=41
内容的提问来源于stack exchange,提问作者JsonStatham
相关产品推荐
相关产品推荐

