代码之家  ›  专栏  ›  技术社区  ›  Maxim Rudolovskii

在ASP.NET中,有没有从查询字符串中获取复杂对象的方法。网8?

  •  0
  • Maxim Rudolovskii  · 技术社区  · 10 月前

    我试图从查询字符串中获取一个复杂的对象,对象有一些基本类型和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 回复  |  直到 10 月前
        1
  •  0
  •   GM_AM    10 月前

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

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

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

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

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

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

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