【问题标题】:How to pass table of objects using query string?如何使用查询字符串传递对象表?
【发布时间】:2020-11-23 17:06:54
【问题描述】:

我需要在我的 .NET Core 3.1 API 项目中分享一些发货信息。我设计了一个端点,它返回满足 SearchResultsDto 对象中包含的过滤条件的对象集合。过滤机制的工作原理很简单。在客户端,用户选择一个属性,并为其提供一些值。用户可能希望使用一个、两个甚至更多属性来过滤表。所以我的控制器方法需要将一组过滤器(对属性过滤器值)作为参数。这是我的方法和过滤器类定义:

        [HttpGet]
        public async Task<ActionResult<SearchResultsDto>> GetShipmentAsync([FromQuery] ICollection<Filter> filters,
            [FromQuery] int page,
            [FromQuery] int pageCapacity,
            [FromQuery] DateTime dateTimeInfimum,
            [FromQuery] DateTime dateTimeSupremum,
            [FromQuery] bool withPodOnly) =>
                Ok(await QueryBus
                    .SendAsync<GetShipmentQuery, SearchResultsDto>(new GetShipmentQuery
                        {
                            Page = page,
                            PageCapacity = pageCapacity,
                            DateTimeInfimum = dateTimeInfimum,
                            DateTimeSupremum = dateTimeSupremum,
                            WithPodOnly = withPodOnly,
                            Filters = filters
                        }));

       public class Filter
       {
            public string PropertyName { get; set; }
            public string FilterValue { get; set; }
       }

如何使用查询字符串正确传递过滤器对象数组?将查询字符串用于这种行为是一种好方法吗?如果没有,我应该如何设计我的端点?如何序列化 JavaScript 对象,并使用 axios 以适当的方式使用 GET 方法发送它?

我已经尝试过类似的方法:

https://localhost:44348/api/shipment?filters=[propertyName=materialReleaseReceipt&filterValue=WZ]&page=1&pageCapacity=4&dateTimeInfimum=2012-04-23T18:25:43.511Z&dateTimeSupremum=2012-04-23T18:25:43.511Z&withPodOnly=true

但它不起作用。过滤器集合未正确解析。

【问题讨论】:

  • 这完全取决于您,尽管我可能会添加“不是您目前的操作方式”。顺便说一句,GET 请求可以有一个主体,将其作为 JSON 块发送可能是最干净的
  • 我建议您将端点更改为HttpPost 并解析过滤器集合[FromBody],同时继续从查询字符串中读取其他参数。由于 GET 请求可以被浏览器缓存,并且将正文作为 GET 请求的一部分发送可能会导致问题
  • 请详细说明这些“问题”
  • 嗨@Bulchsu,我的回答对您解决问题有帮助吗?

标签: javascript c# asp.net-core .net-core axios


【解决方案1】:

如果你想通过查询字符串传递数据,你可以像下面这样传递,

https://localhost:44385/weatherforecast?filters[0].Id=1&amp;filters[1].Id=2

【讨论】:

    【解决方案2】:

    只需像下面这样编写查询字符串:

    https://localhost:44348/api/shipment?[0].propertyName=materialReleaseReceipt&[0].filterValue=WZ&page=1&pageCapacity=4&dateTimeInfimum=2012-04-23T18:25:43.511Z&dateTimeSupremum=2012-04-23T18:25:43.511Z&withPodOnly=true
    

    更多模型绑定细节,可以参考doc

    【讨论】:

      猜你喜欢
      • 2014-04-11
      • 2011-10-31
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多