2014-12-12 1 views
11

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

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

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

+0

Попробуйте System.Uri: HTTP : //msdn.microsoft.com/pl-pl/library/system.uri%28v=vs.110%29.aspx –

+1

Почему вы заботитесь о размере System.Web? его все равно уже развернуты в рамках – fixagon

+0

здесь решение: http://stackoverflow.com/questions/14517798/append-values-to-query-string – lem2802

ответ

6

HttpValueCollection, который вы используете в своем примере, фактически не является тривиальным и использует множество других частей библиотеки System.Web для кодирования действительного URL-адреса 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()); 
+1

Surround 'key' и' value' с 'WebUtility.UrlEncode()'. –

+0

@SevaAlekseyev - Сделано, хорошее предложение :) –