Альтернатива HttpUtility.ParseQueryString без зависимости System.Web?

Я хочу иметь возможность создавать строки URL-запросов, просто добавляя ключ и значение к некоторому вспомогательному классу и возвращая его в виде URL-запроса. Я знаю, что это можно сделать, вот так:

var queryBuilder= HttpUtility.ParseQueryString("http://baseurl.com/?");
queryBuilder.Add("Key", "Value");
string url =  queryBuilder.ToString();

Именно такое поведение я и преследую. Тем не менее, этот класс существует в знаменитом большом System.Web и я бы предпочел не приносить всю эту библиотеку для этого. Есть ли где-нибудь альтернатива?

1 ответ

Решение

Набор HttpValueCollection, который вы используете в своем примере, на самом деле не является тривиальным и использует множество других частей библиотеки System.Web для кодирования действительного http-адреса для вас. Можно извлечь исходный текст для нужных вам частей, но он, скорее всего, будет каскадным, а не таким, как вы думаете!

Если вы понимаете это и просто хотите что-то примитивное, потому что вы уже гарантируете, что ключи и значения закодированы правильно, самое простое, что вы можете сделать, - это просто свернуть свой собственный.

Вот пример, в форме метода расширения для NameValueCollection:

public static class QueryExtensions
{
    public static string ToQueryString(this NameValueCollection nvc)
    {
        IEnumerable<string> segments = from key in nvc.AllKeys
                                       from value in nvc.GetValues(key)
                                       select string.Format("{0}={1}", 
                                       WebUtility.UrlEncode(key),
                                       WebUtility.UrlEncode(value));
        return "?" + string.Join("&", segments);
    }
}

Вы можете использовать это расширение для построения строки запроса, например, так:

// Initialise the collection with values.
var values = new NameValueCollection {{"Key1", "Value1"}, {"Key2", "Value2"}};

// Or use the Add method, if you prefer.
values.Add("Key3", "Value3");

// Build a Uri using the extension method.
var url = new Uri("http://baseurl.com/" + values.ToQueryString());
Другие вопросы по тегам