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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:30:27