【问题标题】:HttpUtility.ParseQueryString does not allow to add duplicate keyHttpUtility.ParseQueryString 不允许添加重复键
【发布时间】:2019-09-17 11:36:53
【问题描述】:

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

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

但是,ParseQueryString 正在创建查询字符串 url,如下所示,

../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

【问题讨论】:

  • ParseQueryString 字符串返回一个 NameValueCollection,每个键不能有重复的记录,因此值将是“一、二、三”。您始终可以编写一个自定义方法来拆分值并以您想要的方式返回它。我不确定为什么你需要发送相同的参数并且不能只在另一边拆分值(如果你当然可以访问)
  • 不幸的是there is no standard 关于如何发送多个值,而.NET 在很大程度上决定在任何地方使用NameValueCollection,这意味着它几乎必须使用逗号分隔方法。您会认为手动构建查询字符串是一件容易的事,如此简单以至于框架中必须有简单的方法通过适当的编码来实现,但是you'd be mistaken。

标签: c# .net-core query-string


【解决方案1】:

可以通过ASP.NET Core中QueryHelpers类的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

【讨论】:

    【解决方案2】:

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

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

    var query = new QueryBuilder {{"id", itemIds}}.ToQueryString();

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

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

    var query = new QueryBuilder {{"myEnum", myEnums}}.ToQueryString();

    [0]https://github.com/dotnet/aspnetcore/issues/7945

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 2013-02-18
      • 2018-08-31
      • 1970-01-01
      • 2012-12-29
      • 2013-08-22
      • 1970-01-01
      • 2015-04-24
      相关资源
      最近更新 更多