C# 从 IQueryCollection 读取数组
C# reading an Array from IQueryCollection
在 C# Asp.netcore 项目中工作,我试图从 GET 请求中的 IQueryCollection 中读取一个数组。 IQueryCollection 位于 Request.Query.
我需要阅读没有模型的查询。当前端json打到后端的时候,就不再是JSON了,前端传过来的我只需要读就行了。在这个例子中它是一个 int 数组,但它可以是任何东西。
模型不能很好地扩展查询。对于 return 一个 get 模型,它们工作得非常出色,但是对于一个可以像它需要的那样复杂或简单的查询,我不能承诺模型。如果我可以将查询提取到匿名对象,那将非常有用。
Json从前端传过来:
var params = {
items: [1, 4, 5],
startDate: new Date(),
endDate: new Date()
}
C# Request.Query字符串
{?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; }
}
在 C# Asp.netcore 项目中工作,我试图从 GET 请求中的 IQueryCollection 中读取一个数组。 IQueryCollection 位于 Request.Query.
我需要阅读没有模型的查询。当前端json打到后端的时候,就不再是JSON了,前端传过来的我只需要读就行了。在这个例子中它是一个 int 数组,但它可以是任何东西。
模型不能很好地扩展查询。对于 return 一个 get 模型,它们工作得非常出色,但是对于一个可以像它需要的那样复杂或简单的查询,我不能承诺模型。如果我可以将查询提取到匿名对象,那将非常有用。
Json从前端传过来:
var params = {
items: [1, 4, 5],
startDate: new Date(),
endDate: new Date()
}
C# Request.Query字符串
{?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; }
}