Обратная функция 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"
Ответ 3
Я не думаю, что есть встроенный в один, но вот пример того, как реализовать http://blog.leekelleher.com/2008/06/06/how-to-convert-namevaluecollection-to-a-query-string/
Ответ 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¶m2=whatever2¶m3=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;
}