it-swarm-tr.com

Bir sorgu dizesi .NET'te bir NameValueCollection içine ayrıştırma

p1=6&p2=7&p3=8 gibi bir dize bir NameValueCollection içine ayrıştırmak istiyorum.

Page.Request nesnesine erişiminiz olmadığında bunu yapmanın en zarif yolu nedir?

181
Nathan Smith

Bunun için yerleşik bir .NET yardımcı programı var: HttpUtility.ParseQueryString

// C#
NameValueCollection qscoll = HttpUtility.ParseQueryString(querystring);
' VB.NET
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)

querystring ile new Uri(fullUrl).Query ile değiştirmeniz gerekebilir.

348
Guy Starbuck

HttpUtility.ParseQueryString, bir web uygulamasında olduğunuz veya System.Web'e bağımlılık dahil olmak üzere sakıncası olmadığı sürece çalışacaktır. Bunu yapmanın başka bir yolu:

NameValueCollection queryParameters = new NameValueCollection();
string[] querySegments = queryString.Split('&');
foreach(string segment in querySegments)
{
   string[] parts = segment.Split('=');
   if (parts.Length > 0)
   {
      string key = parts[0].Trim(new char[] { '?', ' ' });
      string val = parts[1].Trim();

      queryParameters.Add(key, val);
   }
}
43
Scott Dorman

Cevapların çoğu, kabul edilen cevap verenin System.Web 'e bağımlılığı nedeniyle özel örnekler veriyor. Microsoft.AspNet.WebApi.Client NuGet paketinden bir de riExtensions.ParseQueryString kullanılabilecek bir yöntem var:

var uri = new Uri("https://stackoverflow.com/a/22167748?p1=6&p2=7&p3=8");
NameValueCollection query = uri.ParseQueryString();

Bu yüzden System.Web bağımlılığından kaçınmak ve kendinize ait bir şey almak istemiyorsanız, bu iyi bir seçenektir.

25
James Skimming

"Yalnızca İstemci Çerçevesi Alt Kümesi" ile sınırlı önkoşullara sahipken, ClickOnce dağıtımının sorgu dizesini ayrıştırmak için System.Web bağımlılığını kaldırmak istedim.

RP'nin cevabını beğendim. Biraz ek mantık ekledim.

public static NameValueCollection ParseQueryString(string s)
    {
        NameValueCollection nvc = new NameValueCollection();

        // remove anything other than query string from url
        if(s.Contains("?"))
        {
            s = s.Substring(s.IndexOf('?') + 1);
        }

        foreach (string vp in Regex.Split(s, "&"))
        {
            string[] singlePair = Regex.Split(vp, "=");
            if (singlePair.Length == 2)
            {
                nvc.Add(singlePair[0], singlePair[1]);
            }
            else
            {
                // only one key with no value specified in query string
                nvc.Add(singlePair[0], string.Empty);
            }
        }

        return nvc;
    }
19
densom

OLSC sorgularıyla çalışırken zaten sağlananlardan biraz daha yönlü bir fonksiyona ihtiyacım vardı.

  • Değerler birden fazla eşit işaret içerebilir
  • Kodlanmış karakterleri hem isim hem de değer olarak kodlayın
  • Client Framework üzerinde çalışabilme özelliği
  • Mobile Framework üzerinde çalışabilir.

İşte benim çözümüm:

Public Shared Function ParseQueryString(ByVal uri As Uri) As System.Collections.Specialized.NameValueCollection
    Dim result = New System.Collections.Specialized.NameValueCollection(4)
    Dim query = uri.Query
    If Not String.IsNullOrEmpty(query) Then
        Dim pairs = query.Substring(1).Split("&"c)
        For Each pair In pairs
            Dim parts = pair.Split({"="c}, 2)

            Dim name = System.Uri.UnescapeDataString(parts(0))
            Dim value = If(parts.Length = 1, String.Empty,
                System.Uri.UnescapeDataString(parts(1)))

            result.Add(name, value)
        Next
    End If
    Return result
End Function

Bu özelliği Uri'nin kendisine eklemek için <Extension()> ile de yapmak kötü bir fikir olmayabilir.

7
Josh Brown

System.Web olmadan, kendiniz yazmadan ve ek NuGet paketleri olmadan bunu yapmak için:

  1. System.Net.Http.Formatting için bir referans ekle
  2. using System.Net.Http; ekle
  3. Bu kodu kullan:

    new Uri(uri).ParseQueryString()
    

https://msdn.Microsoft.com/en-us/library/system.net.http.uriextensions (v = vs.118) .aspx

7
jvenema

Az önce fark ettim ki Web API İstemcisi , ParseQueryString üzerinde çalışan ve _ Uri üzerinde çalışan HttpValueCollection uzantı yöntemine sahip olduğunu:

var parameters = uri.ParseQueryString();
string foo = parameters["foo"];
2
Thomas Levesque

--- HttpUtility.ParseQueryString kullanmak için gereken System.Web'e bağımlılıktan kaçınmak istiyorsanız, _System.Net.Http_ içinde bulunan Uri uzatma yöntemi ParseQueryString kullanabilirsiniz. .

Projenize _System.Net.Http_ için bir başvuru (henüz yapmadıysanız) eklediğinizden emin olun.

Yanıt gövdesini geçerli bir Uri değerine dönüştürmeniz gerektiğini unutmayın, böylece ParseQueryString (in _System.Net.Http_) çalışır.

_string body = "value1=randomvalue1&value2=randomValue2";

// "http://localhost/query?" is added to the string "body" in order to create a valid Uri.
string urlBody = "http://localhost/query?" + body;
NameValueCollection coll = new Uri(urlBody).ParseQueryString();
_
2
Amadeus Sánchez
    private void button1_Click( object sender, EventArgs e )
    {
        string s = @"p1=6&p2=7&p3=8";
        NameValueCollection nvc = new NameValueCollection();

        foreach ( string vp in Regex.Split( s, "&" ) )
        {
            string[] singlePair = Regex.Split( vp, "=" );
            if ( singlePair.Length == 2 )
            {
                nvc.Add( singlePair[ 0 ], singlePair[ 1 ] );    
            }    
        }
    }
2
rp.

Sadece Request.QueryString'e erişin. Başka bir cevap olarak belirtilen AllKeys sadece bir anahtar dizisi alır.

1
Bloodhound

System.Web bağımlılığını istemiyorsanız, bu kaynak kodunu HttpUtility sınıfından yapıştırmanız yeterlidir.

Bunu birlikte Mono kaynak kodundan çırpmıştım. HttpUtility ve tüm bağımlılıklarını (IHtmlString, Helpers, HttpEncoder, HttpQSCollection gibi) içerir.

Sonra HttpUtility.ParseQueryString kullanın.

https://Gist.github.com/bjorn-ALi-goransson/b04a7c44808bb2de8cca3fc9a3762f9c

1
user3638471

HttpUtility.ParseQueryString(Request.Url.Query) return, HttpValueCollection (dahili sınıf) şeklindedir. NameValueCollection öğesinden devralınır.

    var qs = HttpUtility.ParseQueryString(Request.Url.Query);
    qs.Remove("foo"); 

    string url = "~/Default.aspx"; 
    if (qs.Count > 0)
       url = url + "?" + qs.ToString();

    Response.Redirect(url); 
1
alex1kirch

Herkes çözümünü yapıştırıyor gibi görünüyor ... işte benim :-) Bu, depolanan köprülerden id parametrelerini almak için System.Web olmadan bir sınıf kütüphanesinden buna ihtiyacım vardı.

Paylaşacağımı düşündüm çünkü bu çözümü daha hızlı ve daha iyi buluyorum.

public static class Statics
    public static Dictionary<string, string> QueryParse(string url)
    {
        Dictionary<string, string> qDict = new Dictionary<string, string>();
        foreach (string qPair in url.Substring(url.IndexOf('?') + 1).Split('&'))
        {
            string[] qVal = qPair.Split('=');
            qDict.Add(qVal[0], Uri.UnescapeDataString(qVal[1]));
        }
        return qDict;
    }

    public static string QueryGet(string url, string param)
    {
        var qDict = QueryParse(url);
        return qDict[param];
    }
}

Kullanımı:

Statics.QueryGet(url, "id")
1
Tiele Declercq

Request.QueryString.Keys, tüm sorgu dizesi parametrelerinin bir NameValueCollection öğesini seçin.

0
Mark Glorie
        var q = Request.QueryString;
        NameValueCollection qscoll = HttpUtility.ParseQueryString(q.ToString());
0
Hamit YILDIRIM

Tüm Querystring değerlerini almak için şunu deneyin:

    Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)

Dim sb As New StringBuilder("<br />")
For Each s As String In qscoll.AllKeys

  Response.Write(s & " - " & qscoll(s) & "<br />")

Next s
0
mirko cro 1234