C# HttpUtility.ParseQueryString不允许添加重复密钥

C# HttpUtility.ParseQueryString不允许添加重复密钥,c#,.net-core,query-string,C#,.net Core,Query String,我有一个Web API端点,它需要一个枚举值列表。我正在使用HttpUtility.ParseQueryString生成查询字符串,我希望在查询字符串中传递多个键值对,如下所示 ../api/getdata?myEnum=One&myEnum=Two&myEnum=Three ../api/getdata?myEnum=One%2cTwo%2cThree 但是,ParseQueryString正在创建查询字符串url,如下所示 ../api/getdata?myEnum=On

我有一个Web API端点,它需要一个枚举值列表。我正在使用HttpUtility.ParseQueryString生成查询字符串,我希望在查询字符串中传递多个键值对,如下所示

../api/getdata?myEnum=One&myEnum=Two&myEnum=Three
../api/getdata?myEnum=One%2cTwo%2cThree
但是,ParseQueryString正在创建查询字符串url,如下所示

../api/getdata?myEnum=One&myEnum=Two&myEnum=Three
../api/getdata?myEnum=One%2cTwo%2cThree
这是我的密码

var queryString = System.Web.HttpUtility.ParseQueryString(string.Empty);
queryString.Add("myEnum", "One");
queryString.Add("myEnum", "Two");
queryString.Add("myEnum", "Three");
如何创建具有重复键的预期查询字符串url

../api/getdata?myEnum=One&myEnum=Two&myEnum=Three

您可以通过
ASP.NET Core
中类的
AddQueryString
方法实现预期结果

此类包含在
Microsoft.AspNetCore.WebUtilities
NuGet包中

string url = "http://yourservice/api/getdata";

url = QueryHelpers.AddQueryString(url, "myEnum", "One");
url = QueryHelpers.AddQueryString(url, "myEnum", "Two");
url = QueryHelpers.AddQueryString(url, "myEnum", "Three");

Console.WriteLine(url); // http://yourservice/api/getdata?myEnum=One&myEnum=Two&myEnum=Three

您可以通过
ASP.NET Core
中类的
AddQueryString
方法实现预期结果

此类包含在
Microsoft.AspNetCore.WebUtilities
NuGet包中

string url = "http://yourservice/api/getdata";

url = QueryHelpers.AddQueryString(url, "myEnum", "One");
url = QueryHelpers.AddQueryString(url, "myEnum", "Two");
url = QueryHelpers.AddQueryString(url, "myEnum", "Three");

Console.WriteLine(url); // http://yourservice/api/getdata?myEnum=One&myEnum=Two&myEnum=Three

不久前[0]使用
QueryBuilder
添加了此功能

现在可以使用查询生成器并传入
IEnumerable
。因此,如果我想向查询添加一组
id=something
参数,我可以这样做:

var query=newquerybuilder{{“id”,itemIds}}.ToQueryString()

这将给我一个查询字符串,格式为:
?id=1&id=2&id=…

在您的特定情况下,如果您有一个枚举的
IEnumerable
,则会是这样

var query=newquerybuilder{{{“myEnum”,myEnums}}.ToQueryString()


[0]

此功能是在[0]前使用
QueryBuilder
添加的

现在可以使用查询生成器并传入
IEnumerable
。因此,如果我想向查询添加一组
id=something
参数,我可以这样做:

var query=newquerybuilder{{“id”,itemIds}}.ToQueryString()

这将给我一个查询字符串,格式为:
?id=1&id=2&id=…

在您的特定情况下,如果您有一个枚举的
IEnumerable
,则会是这样

var query=newquerybuilder{{{“myEnum”,myEnums}}.ToQueryString()


[0]

ParseQueryString返回一个NameValueCollection,该集合的每个键不能有重复的记录,因此该值将为“一、二、三”。您始终可以编写一个自定义方法,该方法将拆分值并按您想要的方式返回它。我不知道为什么您需要发送相同的参数,并且不能只在另一端拆分值(当然,如果您有访问权限的话),不幸的是,关于如何发送多个值,.NET基本上决定在任何地方都使用
NameValueCollection
,这意味着它几乎必须使用逗号分隔方法。您可能会认为手动构建查询字符串是一件容易的事情,非常容易,因此在框架中必须有简单的方法通过正确的编码来实现,但是.ParseQueryString字符串返回一个NameValueCollection,它不能每个键都有重复的记录,因此该值将是“一、二、三”。您始终可以编写一个自定义方法,该方法将拆分值并按您想要的方式返回它。我不知道为什么您需要发送相同的参数,并且不能只在另一端拆分值(当然,如果您有访问权限的话),不幸的是,关于如何发送多个值,.NET基本上决定在任何地方都使用
NameValueCollection
,这意味着它几乎必须使用逗号分隔方法。您可能会认为手动构建查询字符串是一件容易的事情,非常容易,因此在框架中必须有简单的方法通过适当的编码来实现,但是。