Обратная функция HttpUtility.ParseQueryString

Класс

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

public static NameValueCollection ParseQueryString(string query);

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

Ответ 1

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

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

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

var output = querystringCollection.ToString(); 

output = "test = value1 & test = value2"

Ответ 2

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

Я обнаружил, что сочетание классов 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.

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

Ответ 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;
    }