我试图从查询字符串中获取一个复杂的对象,对象有一些基本类型和2个用于过滤和排序的类数组,但是当我从查询字符串中获取对象时,这2个数组是空的。
我试图向 Chat-GPT 询问此事,用谷歌搜索这个问题,但没有找到任何可以帮助我的东西。
这是我的 DTO:
public record GetItemsSortedDto(
int ParentId,
SortingFieldDto[]? SortFields,
Filter[]? Filters,
int Page = 1,
int PageSize = 10,
string OrderColumn = "Number",
bool IsSortedAsc = true)
: IStandardForTypesOfConstructionDto;
public class SortingFieldDto
{
public string Field { get; set; } = "Number";
public object RangeStart { get; set; } = null!;
public object RangeEnd { get; set; } = null!;
}
public class Filter
{
public string Id { get; set; } = "TypeOfConstruction";
[FromQuery(Name = "Value")]
public string[] Values { get; set; } = null!;
}
这是我的控制器方法
[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);
}
我尝试使用模型绑定,但没有成功。在DTO中,我需要存储排序和过滤数组,因此我可以同时排序和过滤多于1列。
更新: 上述解决方案应该有助于使用 [fromBody] 属性绑定对象,但不幸的是(相同的文档):
“路由数据和查询字符串值仅用于简单类型。”
所以你不能仅从查询字符串绑定复杂对象。
原文: 来自 Microsoft 模型绑定文档 (https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-8.0#complex-types)
“复杂类型必须具有公共默认构造函数和要绑定的公共可写属性”。
您的 Dto 类使用新的构造函数模型(这应该不是问题),但它只有字段而没有属性。
我会尝试将字段重构为实际属性。