使查询字符串给定键值对等的任何 .NET 类

本文关键字:对等的 任何 NET 键值对 键值 查询 字符串 | 更新日期: 2023-09-27 18:37:20

.NET 框架中是否有一个类,如果给定键值对的序列/可枚举(或其他任何我不严格的格式)可以创建如下所示的查询字符串:

?foo=bar&gar=har&print=1

我可以自己完成这项微不足道的任务,但我想我会要求避免自己重新发明轮子。为什么当一行代码就可以做到时,所有这些弦体操都可以做到?

使查询字符串给定键值对等的任何 .NET 类

可以使用

System.Web.HttpUtility.ParseQueryString创建一个空System.Web.HttpValueCollection,并像NameValueCollection一样使用它。

例:

var query = System.Web.HttpUtility.ParseQueryString(string.Empty);
query ["foo"] = "bar";
query ["gar"] = "har";
query ["print"] = "1";
var queryString = query.ToString(); // queryString is 'foo=bar&gar=har&print=1'

据我所知,.NET 框架中没有内置任何东西,尽管几乎

有很多。

System.Web.HttpRequest.QueryString是一个预解析的NameValueCollection,而不是可以输出查询字符串的东西。 System.NetHttpWebRequest 希望传递预先形成的 URI,并且System.UriBuilder具有 Query 属性,但同样,需要整个查询字符串的预格式字符串。

但是,运行"querystringbuilder"的快速搜索会在Web中显示一些可以实现的实现。布拉德·文森特(Brad Vincent)的这个就是这样,它为您提供了一个简单的流畅界面:

//take an existing string and replace the 'id' value if it exists (which it does)
//output : "?id=5678&user=tony"
strQuery = new QueryString("id=1234&user=tony").Add("id", "5678", true).ToString();

而且,虽然不是很优雅,但我在 RestSharp 中找到了一种方法,正如@sasfrog在我的问题评论中所建议的那样。这是方法。

来自 RestSharp-master''RestSharp''Http.cs

private string EncodeParameters()
{
  var querystring = new StringBuilder();
  foreach (var p in Parameters)
  {
    if (querystring.Length > 0)
      querystring.Append("&");
    querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), p.Value.UrlEncode());
  }
  return querystring.ToString();
}

再说一次,不是很优雅,也不是我所期望的,但是嘿,它完成了工作并节省了一些打字时间。

我真的在寻找类似席欢的答案(标记正确答案)的东西,但这也很有效。

.NET Framework 中没有内置任何内容来保留查询参数 AFAIK 的顺序。以下帮助程序执行此操作,跳过 null 值,并将值转换为固定字符串。当与KeyValueList结合使用时,它使构建URI变得非常容易。

public static string ToUrlQuery(IEnumerable<KeyValuePair<string, object>> pairs)
{
    var q = new StringBuilder();
    foreach (var pair in pairs)
        if (pair.Value != null) {
            if (q.Length > 0) q.Append('&');
            q.Append(pair.Key).Append('=').Append(WebUtility.UrlEncode(Convert.ToString(pair.Value, CultureInfo.InvariantCulture)));
        }
    return q.ToString();
}