2010-04-09 27 views
11

NET en System.Web.HttpUtility sınıf bir NameValueCollection içine bir sorgu dizesi ayrıştırmak için the following function tanımlar:Ters fonksiyon

public static NameValueCollection ParseQueryString(string query); 

ters yapmak bir fonksiyon var mıdır (yani bir sorgu dizesi ile bir NameValueCollection dönüştürmek için) ?

+1

Benzer Sorular http://stackoverflow.com/questions/229925/outputing-a-manipulated-querystring-in-c/ http://stackoverflow.com/questions/829080/how-to-build-a- sorgu-string-for-a-url-in-c – Palani

cevap

4

A NameValueCollection sahip bir otomatik ToString() yönteminin nasıl uygulanacağını bir örnektir .

Kendi yazmanızı istemezsiniz.

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

var output = querystringCollection.ToString(); 

çıkış = "testi = deger1 & Test = deger2"

+10

Yanlış. "System.Collections.Specialized.NameValueCollection" bunu desteklemiyor. Bu "System.Web.HttpValueCollection" bir özelliktir. –

+1

... ve "System.Web.HttpValueCollection" dahili bir türüdür. – Scott

+0

Bunun uluslararası karakterleri işlemediğini unutmayın; karakterlerden kaçmak için dahili olarak HttpUtility.UrlEncodeUnicode kullanır. – Rune

20

System.Collections.Specialized.NameValueCollectiondeğil destek yapar, ancak bir türetilmiş iç sınıf System.Web.HttpValueCollection(ToString() geçersiz kılma) Mİ.

Ne yazık ki (dahili olarak) bu sınıfı doğrudan oluşturamazsınız, ancak bir tanesi HttpUtility.ParseQueryString() tarafından döndürülür (ve bunu String.Empty ile değil, Null ile de arayabilirsiniz).

Bir HttpValueCollection sahip olduktan sonra, nihayet ToString() çağırmadan önce, Add() arayarak Orijinal NameValueCollection onu doldurabilir.

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

oldukça havalı işler :) – Sergey

-1
Burada

2 çok yararlı fonksiyonlar olmamasıdır her zaman kullanın:

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

buldum UriBuilder ve HttpUtility sınıfların bir arada sorgu parametrelerini manipüle etmek benim gereksinimlerini karşıladığını. Uri sınıfı kendi başına yeterli değildir, özellikle de Query özelliği salt okunur olduğu için. URL dizesinde

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

Yukarıdaki kod sonuçları: ToString() bir Uri özellik aracılığıyla gider http://example.com/something?param1=whatever&param2=whatever2&param3=whatever2

Not aksi çıkış dizesi içinde açık bir port 80 olurdu.

Tüm bunları çerçeve sınıflarını kullanarak yapabilmek ve kendi kodumuzu yazmak zorunda kalmamak çok güzel.