2010-04-09 6 views
11

.Net classe System.Web.HttpUtility définit the following function pour analyser une chaîne de requête dans un NameValueCollection:fonction inverse de HttpUtility.ParseQueryString

public static NameValueCollection ParseQueryString(string query); 

Y at-il fonction de faire l'inverse (c.-à-convertir un NameValueCollection dans une chaîne de requête) ?

+1

Questions similaires 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

Répondre

4

NameValueCollection a une méthode ToString automatique() qui va écrire tous vos éléments comme un querystring automatiquement .

vous n'avez pas besoin d'écrire les vôtres.

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

var output = querystringCollection.ToString(); 

output = "test = valeur1 & test = valeur2"

+10

Incorrect. "System.Collections.Specialized.NameValueCollection" ne supporte PAS cela. C'est une caractéristique de "System.Web.HttpValueCollection". –

+1

... et "System.Web.HttpValueCollection" est un type interne. – Scott

+0

Notez que cela ne gère pas les caractères internationaux; il utilise HttpUtility.UrlEncodeUnicode en interne pour échapper les caractères. – Rune

20

System.Collections.Specialized.NameValueCollection ne pas soutien, mais une classe interne dérivée System.Web.HttpValueCollectionDOES (en remplaçant ToString()).

Malheureusement (étant interne), vous ne pouvez pas instancier cette classe directement, mais un est renvoyé par HttpUtility.ParseQueryString() (et vous pouvez l'appeler avec String.Empty, mais pas Null).

Une fois que vous avez un HttpValueCollection, vous pouvez le remplir en appelant Add() de votre NameValueCollection d'origine, avant de finalement appeler 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

assez cool travail autour de :) – Sergey

-1

Voici 2 fonctions très utiles que je utiliser tout le temps:

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

Je trouve qu'une combinaison de UriBuilder et HttpUtility cours répond à mes exigences pour manipuler les paramètres de la requête. La classe Uri en elle-même ne suffit pas, en particulier car sa propriété Query est en lecture seule.

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

Les résultats de code ci-dessus dans la chaîne URL: http://example.com/something?param1=whatever&param2=whatever2&param3=whatever2

Notez que le ToString() passe par une propriété Uri, sinon la chaîne de production aurait un port explicite 80 en elle.

C'est sympa de pouvoir faire tout ça en utilisant des classes de framework et de ne pas avoir à écrire notre propre code.