.NET 8 Minimal API如何从查询字符串绑定List<T>参数?
.NET 8 Minimal API 查询字符串绑定 List 解决方案
针对你遇到的查询字符串绑定List<ColumnFilterDto>的问题,以下是几种可行的实现方案:
方案一:包装类 + [AsParameters]
Minimal API的[AsParameters]支持将类的属性映射到查询参数,通过包装类间接实现集合绑定:
首先定义包装类和DTO:
public class FilterRequest { public List<ColumnFilterDto>? Filters { get; set; } } public class ColumnFilterDto { public string? ColumnName { get; set; } public string? FilterValue { get; set; } }
然后编写API端点:
app.MapGet("/api/filter-data", ([AsParameters] FilterRequest request) => { // 直接使用request.Filters return Results.Ok(request.Filters); });
查询字符串采用索引式格式传递参数:
/api/filter-data?Filters[0].ColumnName=Id&Filters[0].FilterValue=100&Filters[1].ColumnName=Name&Filters[1].FilterValue=Alice
方案二:手动解析查询字符串
直接通过HttpRequest手动提取并解析查询参数,完全控制绑定逻辑:
app.MapGet("/api/filter-data", (HttpRequest req) => { var filters = new List<ColumnFilterDto>(); var query = req.Query; // 处理索引式参数(推荐,避免参数顺序问题) int index = 0; while (true) { var nameKey = $"Filters[{index}].ColumnName"; var valueKey = $"Filters[{index}].FilterValue"; if (!query.ContainsKey(nameKey) || !query.ContainsKey(valueKey)) break; filters.Add(new ColumnFilterDto { ColumnName = query[nameKey], FilterValue = query[valueKey] }); index++; } // 也可处理重复键格式(需保证参数顺序对应) /* var columnNames = query["ColumnName"].ToList(); var filterValues = query["FilterValue"].ToList(); for (int i = 0; i < Math.Min(columnNames.Count, filterValues.Count); i++) { filters.Add(new ColumnFilterDto { ColumnName = columnNames[i], FilterValue = filterValues[i] }); } */ return Results.Ok(filters); });
方案三:自定义绑定逻辑
通过BindAsync实现自定义参数绑定,复用性更高:
首先编写绑定逻辑类:
public static class ColumnFilterListBinder { public static async ValueTask<List<ColumnFilterDto>?> BindAsync(HttpContext context, ParameterInfo parameter) { var query = context.Request.Query; var filters = new List<ColumnFilterDto>(); int index = 0; while (true) { var nameKey = $"filters[{index}].ColumnName"; var valueKey = $"filters[{index}].FilterValue"; if (!query.ContainsKey(nameKey) || !query.ContainsKey(valueKey)) break; filters.Add(new ColumnFilterDto { ColumnName = query[nameKey], FilterValue = query[valueKey] }); index++; } return filters.Any() ? filters : null; } }
然后在API端点中使用:
app.MapGet("/api/filter-data", (BindAsync<ColumnFilterListBinder> List<ColumnFilterDto>? filters) => { return Results.Ok(filters); });
查询字符串使用filters[0].ColumnName=Id&filters[0].FilterValue=100格式即可。
内容的提问来源于stack exchange,提问作者adriannowaq
相关产品推荐
相关产品推荐

