Обратная функция HttpUtility.ParseQueryString - PullRequest
11 голосов
/ 09 апреля 2010
Класс

.Net System.Web.HttpUtility определяет следующую функцию для анализа строки запроса в NameValueCollection:

public static NameValueCollection ParseQueryString(string query);

Есть ли какая-либо функция для обратного (т. Е. Для преобразования NameValueCollection в строку запроса)?

Ответы [ 5 ]

23 голосов
/ 22 декабря 2011

System.Collections.Specialized.NameValueCollection поддерживает НЕ , но поддерживает производный внутренний класс System.Web.HttpValueCollection DOES (путем переопределения ToString()).

К сожалению (будучи внутренним), вы не можете создать экземпляр этого класса напрямую, но один возвращается HttpUtility.ParseQueryString() (и вы можете вызвать это с помощью String.Empty, но не Null).

Когда у вас есть HttpValueCollection, вы можете заполнить его из своего исходного NameValueCollection, позвонив по номеру Add(), прежде чем, наконец, позвонить по номеру 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"

4 голосов
/ 25 марта 2011

NameValueCollection имеет автоматический метод ToString (), который автоматически запишет все ваши элементы в виде строки запроса.

вам не нужно писать свой собственный.

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

var output = querystringCollection.ToString(); 

output = "test = value1 & test = value2"

2 голосов
/ 19 декабря 2014

Я обнаружил, что комбинация классов UriBuilder и HttpUtility отвечает моим требованиям для манипулирования параметрами запроса. Класс 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.

Приятно иметь возможность делать все это, используя классы фреймворка, и не нужно писать собственный код.

2 голосов
/ 09 апреля 2010

Я не думаю, что есть встроенный, но вот пример того, как реализовать http://blog.leekelleher.com/2008/06/06/how-to-convert-namevaluecollection-to-a-query-string/

0 голосов
/ 25 августа 2012

Вот две очень полезные функции, которые я использую постоянно:

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