12

.Net 的System.Web.HttpUtility类定义了以下函数来将查询字符串解析为NameValueCollection

public static NameValueCollection ParseQueryString(string query);

是否有任何功能可以做相反的事情(即将 aNameValueCollection转换为查询字符串)?

4

5 回答 5

25

System.Collections.Specialized.NameValueCollection支持这一点,但派生的内部类支持System.Web.HttpValueCollection 通过覆盖ToString())。

不幸的是(是内部的)你不能直接实例化这个类,但是一个被返回HttpUtility.ParseQueryString()(你可以用String.Empty,但不是Null)返回一个。

一旦你有了一个,你可以在最后调用之前通过调用HttpValueCollection从你的原始文件中填充它。NameValueCollectionAdd()ToString()

var nameValueCollection = new NameValueCollection {{"a","b"},{"c","d"}};
var httpValueCollection = System.Web.HttpUtility.ParseQueryString(String.Empty);
httpValueCollection.Add(nameValueCollection);
var qs = httpValueCollection.ToString();

nameValueCollection.ToString() = "System.Collections.Specialized.NameValueCollection" httpValueCollection.ToString() = "a=b&c=d"

于 2011-12-22T10:57:31.213 回答
4

NameValueCollection 有一个自动 ToString() 方法,它会自动将所有元素作为查询字符串写出。

你不需要自己写。

var querystringCollection = HttpUtility.ParseQueryString("test=value1&test=value2");

var output = querystringCollection.ToString(); 

输出=“测试=值1&测试=值2”

于 2011-03-25T04:17:00.383 回答
3

我发现UriBuilderHttpUtility类的组合满足我操作查询参数的要求。该类Uri本身是不够的,特别是因为它的Query属性是只读的。

var uriBuilder = new UriBuilder("http://example.com/something?param1=whatever");
var queryParameters = HttpUtility.ParseQueryString(uriBuilder.Query);
queryParameters.Add("param2", "whatever2");
queryParameters.Add("param3", "whatever2");
uriBuilder.Query = queryParameters.ToString();
var urlString = uriBuilder.Uri.ToString();

上面的代码生成 URL 字符串:http ://example.com/something?param1=whatever¶m2=whatever2¶m3=whatever2

请注意,ToString() 通过一个Uri属性,否则输出字符串中将有一个明确的端口 80。

很高兴能够使用框架类来完成所有这些工作,而不必编写我们自己的代码。

于 2014-12-19T11:46:06.440 回答
2

我认为没有内置的,但这里有一个如何实现http://blog.leekelleher.com/2008/06/06/how-to-convert-namevaluecollection-to-a-query的示例-细绳/

于 2010-04-09T05:59:04.310 回答
-1

以下是我一直使用的 2 个非常有用的功能:

    private string GetQueryStringParameterValue(Uri url, string key)
    {
        return HttpUtility.ParseQueryString(url.Query.TrimStart('?'))[key];
    }

    private Uri SetQueryStringParameterValue(Uri url, string key, string value)
    {
        var parameters = HttpUtility.ParseQueryString(url.Query.TrimStart('?'));

        parameters[key] = value;

        var uriBuilder = new UriBuilder(url) { Query = parameters.ToString() };

        return uriBuilder.Uri;
    }
于 2012-08-25T05:08:12.920 回答