【问题标题】:C# reading an Array from IQueryCollectionC# 从 IQueryCollection 读取数组
【发布时间】:2021-12-03 14:24:57
【问题描述】:

在 C# Asp.netcore 项目中工作时,我正在尝试从 GET 请求中的 IQueryCollection 读取数组。 IQueryCollection 在 Request.Query 中。

我需要在没有模型的情况下阅读查询。当前端 json 碰到后端时,它不再是 JSON,这很好,我只需要读取前端传递的任何内容。在这个例子中,它是一个 int 数组,但它可以是任何东西。

模型不能很好地用于查询。要在获取时返回模型,它们可以出色地工作,但是对于可能需要的复杂或简单的查询,我无法提交模型。如果我可以将查询提取到匿名对象,那将非常有用。

Json 从前端传过来:

var params = {
   items: [1, 4, 5],
   startDate: new Date(),
   endDate: new Date()
}

C# Request.QueryString

{?items%5B%5D=1&items%5B%5D=4&items%5B%5D=5&startDate=Fri%20Oct%2015%202021%2022%3A30%3A57%20GMT%2B1000%20(Australian%20Eastern%20Standard%20Time)&endDate=Fri%20Oct%2015%202021%2022%3A30%3A57%20GMT%2B1000%20(Australian%20Eastern%20Standard%20Time)}

我试过了:

// Gives me a null
var value = HttpUtility.ParseQueryString(Request.QueryString.Value).Get("items");

// Gives me an empty object {}
var value = Request.Query["items"];

希望这是足够的信息。

【问题讨论】:

  • 感谢您的建议,我确信这可以正常工作,但我正在尝试在没有模型的情况下访问查询值。
  • 那么你必须使用 JSON (de)serializer 来获取“itemPks”属性的值。
  • 我也是这样,因为我将 JSON 对象传递给 get 请求,它变成了一个 get 查询,帖子中的丑陋字符串,不再被认为是 JSON后端。如果我在前端做了一个 JSON.stringify,它可能会解决这个问题,但当我进入项目时,我肯定会再次受到这个问题的困扰。
  • json 字符串是 url 编码的,你必须在解析之前对其进行解码。
  • 你试过谷歌搜索吗?即使最后有一个 site:stackoverflow.com?

标签: c# json asp.net-mvc asp.net-core dynamic


【解决方案1】:

数组的查询字符串格式未定义。一些网络框架使用?foo[]=1&foo[]=2,其他使用?foo=1&foo=2,还有一些使用?foo[0]=1&foo[1]=2

您必须使用与客户端序列化相同的解析服务器端。这适用于您的 [] 语法:

var queryString = "?items%5B%5D=1&items%5B%5D=4&items%5B%5D=5&date=2021-10-15";

var parsed = HttpUtility.ParseQueryString(queryString);

foreach (var key in parsed.AllKeys)
{
    if (key.EndsWith("[]"))
    {
        var values = string.Join(", ", parsed.GetValues(key));
        Console.WriteLine($"{key}: array: {values}.");
    }
    else
    {
        Console.WriteLine($"{key}: scalar: {parsed[key]}.");
    }
}

输出:

items[]: array: 1, 4, 5.
date: scalar: 2021-10-15.

但不是自己解析查询字符串,而是让框架来做。你说你找不到可扩展的模型;我发现手工制作的代码不能很好地扩展。如果您在 JS 端修复日期序列化程序,这样的模型就可以工作:

public class RequestModel
{
    public int[] Items { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

【讨论】:

  • 感谢您的帮助。只需注意模型,因此每次将查询添加到端点时,都会将其添加到单个模型中。这是否意味着如果我有一个返回集合的 API 端点并且该查询可以搜索 40 个属性,那么模型将具有 40 个属性?
猜你喜欢
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
相关资源
最近更新 更多