有没有办法从 ASP.NET Core 8 中的查询字符串获取复杂对象?

问题描述 投票:0回答:1

我试图从查询字符串中获取一个复杂的对象,对象有一些基本类型和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列。

c# asp.net-core get query-string
1个回答
0
投票

更新: 上述解决方案应该有助于使用 [fromBody] 属性绑定对象,但不幸的是(相同的文档):

“路由数据和查询字符串值仅用于简单类型。”

所以你不能仅从查询字符串绑定复杂对象。

原文: 来自 Microsoft 模型绑定文档 (https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-8.0#complex-types)

“复杂类型必须具有公共默认构造函数和要绑定的公共可写属性”。

您的 Dto 类使用新的构造函数模型(这应该不是问题),但它只有字段而没有属性。

我会尝试将字段重构为实际属性。

© www.soinside.com 2019 - 2024. All rights reserved.