c#从IQueryCollection中读取数组



在c# Asp.netcore项目中工作,我试图在GET请求中从IQueryCollection中读取数组。IQueryCollection在Request.Query.

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

模型不能很好地扩展查询。为了在get上返回一个模型,它们工作得很出色,但对于一个查询,可以像它需要的那样复杂或简单,我不能承诺模型。如果我能将查询提取到一个匿名对象,那将非常有用。

前端传入的Json:

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

c#请求。参数

{?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"];

希望这是足够的信息。

数组的查询字符串格式未定义。有些web框架使用?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; }
}

相关内容

  • 没有找到相关文章