2010-04-09 12 views
11

di Net System.Web.HttpUtility definisce the following function ad analizzare una stringa di query in un NameValueCollection:funzione Inversione di HttpUtility.ParseQueryString classe

public static NameValueCollection ParseQueryString(string query); 

C'è qualche funzione per fare il contrario (cioè per convertire un NameValueCollection in una stringa di query) ?

+1

Domande simili http://stackoverflow.com/questions/229925/outputing-a-manipulated-querystring-in-c/ http://stackoverflow.com/questions/829080/how-to-build-a- query-string-per-a-url-in-c – Palani

risposta

4

Un NameValueCollection ha ToString automatica() che scriverà tutti gli elementi come un querystring automaticamente .

non è necessario scrivere il proprio.

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

var output = querystringCollection.ToString(); 

output = "test = valore1 & test = valore2"

+10

errato. "System.Collections.Specialized.NameValueCollection" NON supporta questo. È una funzionalità di "System.Web.HttpValueCollection". –

+1

... e "System.Web.HttpValueCollection" è un tipo interno. – Scott

+0

Si noti che questo non gestisce i caratteri internazionali; usa HttpUtility.UrlEncodeUnicode internamente per sfuggire ai caratteri. – Rune

20

System.Collections.Specialized.NameValueCollection fa NON sostegno questo, ma una classe interna derivata System.Web.HttpValueCollectionFA (sovrascrivendo ToString()).

Purtroppo (essendo interno) non è possibile creare un'istanza di questa classe direttamente, ma uno viene restituito da HttpUtility.ParseQueryString() (e si può chiamare questo con String.Empty, ma non Null).

volta che hai un HttpValueCollection, si può riempire dall'originale NameValueCollection chiamando Add(), prima infine di chiamare 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"

+0

lavoro abbastanza bello in giro :) – Sergey

-1

Ecco 2 funzioni molto utili che ho utilizzare tutto il tempo:

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; 
    } 
2

ho scoperto che una combinazione di UriBuilder e HttpUtility classi soddisfa le mie esigenze per manipolare parametri di query. La classe Uri non è sufficiente, in particolare perché la proprietà è di sola lettura.

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(); 

I risultati codice in alto nel stringa URL: http://example.com/something?param1=whatever&param2=whatever2&param3=whatever2

Nota che il ToString() passa tramite una proprietà Uri, altrimenti la stringa di output avrebbero un porto esplicita 80 in essa.

È bello essere in grado di fare tutto questo utilizzando classi di framework e non dover scrivere il nostro codice.