2014-12-12 15 views
11

Desidero essere in grado di creare stringhe di query URL semplicemente aggiungendo la chiave e il valore a qualche classe helper e restituirlo come una query URL. So che questo può essere fatto, in questo modo:Alternativa a HttpUtility.ParseQueryString senza la dipendenza System.Web?

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

Quale è esattamente il comportamento che sto cercando. Tuttavia, questa classe esiste nel famoso grande System.Web e preferirei non portare l'intera libreria per questo. C'è un'alternativa da qualche parte?

+0

Prova System.Uri: http : //msdn.microsoft.com/pl-pl/library/system.uri%28v=vs.110%29.aspx –

+1

perché ti interessa la dimensione di System.Web? la sua comunque già distribuito nel quadro – fixagon

+0

qui una soluzione: http://stackoverflow.com/questions/14517798/append-values-to-query-string – lem2802

risposta

6

L'HttpValueCollection che si sta utilizzando nell'esempio non è in realtà banale e utilizza molte altre parti della libreria System.Web per codificare per te un URL http valido. È possibile estrarre la sorgente per le parti di cui hai bisogno, ma probabilmente verrebbe a cadere in un bel po 'più di quanto pensi!

Se lo capisci e vuoi semplicemente qualcosa di primitivo perché assicuri già che le chiavi e i valori siano codificati correttamente, la cosa più semplice da fare sarebbe semplicemente rotolare la tua.

Ecco un esempio, sotto forma di un metodo di estensione per 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); 
    } 
} 

Si potrebbe utilizzare questa estensione per costruire una stringa di query in questo modo:

// 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' e' value' con 'WebUtility.UrlEncode()'. –

+0

@SevaAlekseyev - Fatto, buon suggerimento :) –