ASP.NET Core 8如何从查询字符串获取含数组的复杂对象?
ASP.NET Core 8 查询字符串绑定复杂数组对象问题解决
核心问题原因
ASP.NET Core的查询字符串模型绑定对复杂对象数组有严格的格式要求,你的SortFields和Filters数组为空,是因为请求的查询字符串未遵循绑定规则,同时SortingFieldDto中的object类型属性也会导致绑定失败。
1. 正确的查询字符串格式
针对你的DTO结构,查询字符串需要按索引+属性名的格式传递数组元素,具体示例如下:
排序字段(SortFields)传递
每个SortingFieldDto元素通过索引指定属性:
SortFields[0].Field=Number&SortFields[0].RangeStart=1&SortFields[0].RangeEnd=100 SortFields[1].Field=CreateTime&SortFields[1].RangeStart=2024-01-01&SortFields[1].RangeEnd=2024-12-31
筛选条件(Filters)传递
每个Filter元素同样通过索引指定,其中Values数组需要重复指定参数名:
Filters[0].Id=TypeOfConstruction&Filters[0].Value=Residential&Filters[0].Value=Commercial Filters[1].Id=Status&Filters[1].Value=Active&Filters[1].Value=Inactive
完整查询字符串示例
/ItemsSorted?ParentId=10&SortFields[0].Field=Number&SortFields[0].RangeStart=1&SortFields[0].RangeEnd=50&SortFields[1].Field=Name&SortFields[1].RangeStart=A&SortFields[1].RangeEnd=M&Filters[0].Id=TypeOfConstruction&Filters[0].Value=Residential&Filters[0].Value=Industrial&Filters[1].Id=Area&Filters[1].Value=North&Page=1&PageSize=15
2. DTO结构调整建议
替换object类型属性
SortingFieldDto中的RangeStart和RangeEnd使用object类型时,ASP.NET Core无法自动将查询字符串的字符串值转换为object,会直接绑定失败。建议换成具体数据类型(如string、int、DateTime):
public class SortingFieldDto { public string Field { get; set; } = "Number"; // 根据实际业务场景替换为具体类型 public string RangeStart { get; set; } = null!; public string RangeEnd { get; set; } = null!; }
如果必须保留object类型,需要自定义模型绑定器处理类型转换,或者在接收后手动将字符串转换为目标类型。
保持Filter类的属性配置
Filter类中的[FromQuery(Name = "Value")]配置正确,但注意传递Values数组时需要重复参数名,而非逗号分隔(默认不支持逗号分隔的数组绑定,若需要此功能需额外配置)。
3. 控制器方法验证
你的控制器方法已经正确添加[FromQuery]特性,无需额外修改:
[HttpGet("ItemsSorted")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task<ActionResult> GetItemsSorted([FromQuery] GetItemsSortedDto getDto) { var query = _mapper.Map<GetItemsByParentSortedQuery>(getDto); var result = await Mediator.Send(query); return Ok(query); }
内容的提问来源于stack exchange,提问作者Maxim Rudolovskii
相关产品推荐
相关产品推荐

