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

问题描述 投票:2回答:4

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

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

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

c# .net
4个回答
6
投票

您可以使用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'

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();

0
投票

而且,尽管不是很优雅,我在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();
}

再一次,不是很优雅,也不是我本来期待的,但是,嘿,它完成了工作并节省了一些打字。

我真的在寻找像Xi Huan的答案(标记正确答案),但这也有效。


0
投票

.NET Framework中没有任何内置功能可以保留查询参数AFAIK的顺序。以下帮助器执行此操作,跳过空值,并将值转换为不变字符串。当与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();
}
© www.soinside.com 2019 - 2024. All rights reserved.