2010-04-09 7 views
11

.Net System.Web.HttpUtility-Klasse definiert the following function eine Abfragezeichenfolge in ein NameValueCollection zu analysieren:Reverse-Funktion von HttpUtility.ParseQueryString

public static NameValueCollection ParseQueryString(string query); 

Gibt es eine Funktion, die umgekehrt zu tun (dh ein NameValueCollection in ein Query-String zu konvertieren) ?

+1

Ähnliche Fragen http://stackoverflow.com/questions/229925/outputing-a-manipulated-querystring-in-c/ http://stackoverflow.com/questions/829080/how-to-build-a- query-string-for-a-url-in-c – Palani

Antwort

4

Eine Namevaluecollection verfügt über eine automatische Methode ToString() zu implementieren, die automatisch alle Elemente aus als Abfragezeichenfolgeflag schreibt .

Sie müssen nicht Ihre eigenen schreiben.

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

var output = querystringCollection.ToString(); 

output = "test = Wert1 & test = Wert2"

+10

Falsch. "System.Collections.Specialized.NameValueCollection" unterstützt dies NICHT. Es ist eine Funktion von "System.Web.HttpValueCollection". –

+1

... und "System.Web.HttpValueCollection" ist ein interner Typ. – Scott

+0

Beachten Sie, dass dies keine internationalen Zeichen behandelt; Es verwendet intern HttpUtility.UrlEncodeUnicode, um Zeichen zu entkommen. – Rune

20

System.Collections.Specialized.NameValueCollection tut NICHT Unterstützung dieses, sondern eine abgeleitete interne Klasse System.Web.HttpValueCollectionDOES (ToString() durch Überschreiben).

Leider (intern) können Sie diese Klasse nicht direkt instanziieren, aber eine wird von HttpUtility.ParseQueryString() zurückgegeben (und Sie können dies mit String.Empty aufrufen, aber nicht Null).

Sobald Sie eine HttpValueCollection haben, können Sie es von Ihrem ursprünglichen NameValueCollection durch den Aufruf Add() ausfüllen, bevor schließlich ToString() aufrufen.

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

ziemlich cool arbeiten :) – Sergey

-1

Hier sind 2 sehr nützliche Funktionen, die ich verwenden die ganze Zeit:

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

ich fand, dass eine Kombination aus UriBuilder und HttpUtility Klassen meine Anforderungen erfüllt Abfrageparameter zu manipulieren. Die Klasse Uri allein reicht nicht aus, zumal die Eigenschaft Query schreibgeschützt ist.

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

Die obige Code führt in der URL-Zeichenfolge: http://example.com/something?param1=whatever&param2=whatever2&param3=whatever2

Beachten Sie, dass der ToString() über eine Uri Eigenschaft geht, sonst wird die Ausgabezeichenfolge würde eine explizite Port 80 in ihm.

Es ist schön, all das mit Framework-Klassen zu tun und nicht unseren eigenen Code schreiben zu müssen.

Verwandte Themen