【问题标题】:Reverse function of HttpUtility.ParseQueryStringHttpUtility.ParseQueryString 的反向函数
【发布时间】:2010-04-09 05:30:39
【问题描述】:

.Net 的System.Web.HttpUtility 类定义the following function 将查询字符串解析为NameValueCollection

public static NameValueCollection ParseQueryString(string query);

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

【问题讨论】:

标签: asp.net asp.net-mvc query-string namevaluecollection


【解决方案1】:

System.Collections.Specialized.NameValueCollection支持这一点,但派生的内部类System.Web.HttpValueCollection支持(通过覆盖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"

【讨论】:

    【解决方案2】:

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

    你不需要自己写。

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

    输出 = "test=value1&test=value2"

    【讨论】:

    • 不正确。 “System.Collections.Specialized.NameValueCollection”不支持这一点。这是“System.Web.HttpValueCollection”的一个特性。
    • ... 而“System.Web.HttpValueCollection”是一个内部类型。
    • 注意这里不处理国际字符;它在内部使用 HttpUtility.UrlEncodeUnicode 来转义字符。
    【解决方案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&param2=whatever2&param3=whatever2

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-27
          • 1970-01-01
          相关资源
          最近更新 更多