2010-04-09 73 views
11

NET的System.Web.HttpUtility类定义the following function解析查询字符串转换为NameValueCollection反向功能

public static NameValueCollection ParseQueryString(string query); 

是否有任何功能,做反向(即一个NameValueCollection转换成一个查询字符串) ?

+1

类似的问题http://stackoverflow.com/questions/229925/outputing-a-manipulated-querystring-in-c/ http://stackoverflow.com/questions/829080/how-to-build-a- query-string-for-a-url-in-c – Palani 2010-04-09 06:15:24

回答

4

一个NameValueCollection中具有自动ToString()方法的例子。

你不需要自己写。

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

var output = querystringCollection.ToString(); 

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

+10

错误。 “System.Collections.Specialized.NameValueCollection”不支持这一点。这是“System.Web.HttpValueCollection”的一个功能。 – 2011-12-22 10:58:52

+1

...和“System.Web.HttpValueCollection”是一个内部类型。 – Scott 2012-08-20 18:08:19

+0

请注意,这不处理国际字符;它在内部使用HttpUtility.UrlEncodeUnicode来转义字符。 – Rune 2013-09-20 15:33:22

20

System.Collections.Specialized.NameValueCollection确实NOT支持这一点,但派生内部类System.Web.HttpValueCollectionDOES(通过重写ToString())。

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

一旦你有一个HttpValueCollection,你可以通过调用Add()来填写你的原始NameValueCollection,最后再打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”

+0

很酷的工作:) – Sergey 2013-10-29 00:23:54

-1

这里有两个非常有用的功能,我用所有的时间:

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; 
    } 
2

我发现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&param2=whatever2&param3=whatever2

注意,toString()方法通过Uri财产去,否则输出字符串将有一个明确的端口80在里面。

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