it-swarm-id.com

Cara mengurai string kueri ke dalam NameValueCollection di .NET

Saya ingin mengurai string seperti p1=6&p2=7&p3=8 menjadi NameValueCollection.

Apa cara paling elegan untuk melakukan ini ketika Anda tidak memiliki akses ke objek Page.Request?

181
Nathan Smith

Ada utilitas .NET bawaan untuk ini: HttpUtility.ParseQueryString

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

Anda mungkin perlu mengganti querystring dengan new Uri(fullUrl).Query.

348
Guy Starbuck

HttpUtility.ParseQueryString akan berfungsi selama Anda berada di aplikasi web atau tidak keberatan menyertakan ketergantungan pada System.Web. Cara lain untuk melakukan ini adalah:

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

Banyak jawaban yang memberikan contoh khusus karena ketergantungan jawaban yang diterima pada System.Web . Dari Microsoft.AspNet.WebApi.Client Paket NuGet ada riExtensions.ParseQueryString , metode yang juga dapat digunakan:

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

Jadi jika Anda ingin menghindari dependensi System.Web dan tidak ingin menggulirkan Anda sendiri, ini adalah opsi yang baik.

25
James Skimming

Saya ingin menghapus ketergantungan pada System.Web sehingga saya dapat mengurai string kueri penyebaran ClickOnce, sementara prasyaratnya terbatas pada "Subset Kerangka Kerja Khusus Klien".

Saya menyukai jawaban rp. Saya menambahkan beberapa logika tambahan.

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

Saya membutuhkan fungsi yang sedikit lebih fleksibel daripada apa yang sudah disediakan saat bekerja dengan permintaan OLSC.

  • Nilai dapat berisi beberapa tanda sama dengan
  • Dekode karakter yang disandikan dalam nama dan nilai
  • Mampu berjalan pada Kerangka Klien
  • Mampu berjalan pada Kerangka Seluler.

Ini solusinya:

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

Ini mungkin bukan ide yang buruk untuk menangani <Extension()> pada itu juga untuk menambah kemampuan Uri itu sendiri.

7
Josh Brown

Untuk melakukan ini tanpa System.Web, tanpa menulisnya sendiri, dan tanpa paket NuGet tambahan:

  1. Tambahkan referensi ke System.Net.Http.Formatting
  2. Tambahkan using System.Net.Http;
  3. Gunakan kode ini:

    new Uri(uri).ParseQueryString()
    

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

7
jvenema

Saya baru menyadari bahwa Klien API Web memiliki metode ekstensi ParseQueryString yang berfungsi pada Uri dan mengembalikan HttpValueCollection:

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

Jika Anda ingin menghindari ketergantungan pada System.Web yang diperlukan untuk menggunakan HttpUtility.ParseQueryString , Anda dapat menggunakan metode ekstensi UriParseQueryString yang ditemukan di System.Net.Http.

Pastikan untuk menambahkan referensi (jika Anda belum) ke System.Net.Http dalam proyek Anda.

Perhatikan bahwa Anda harus mengonversi badan respons ke Uri yang valid sehingga ParseQueryString (dalam System.Net.Http) berfungsi.

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.

Cukup akses Request.QueryString. AllKeys disebut sebagai jawaban lain hanya memberi Anda berbagai kunci.

1
Bloodhound

Jika Anda tidak menginginkan ketergantungan System.Web, cukup tempel kode sumber ini dari kelas HttpUtility.

Saya baru saja mencabut ini bersama-sama dari kode sumber Mono . Ini berisi HttpUtility dan semua dependensinya (seperti IHtmlString, Helpers, HttpEncoder, HttpQSCollection).

Kemudian gunakan HttpUtility.ParseQueryString.

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

1
user3638471

HttpUtility.ParseQueryString(Request.Url.Query) return adalah HttpValueCollection (kelas internal). Itu mewarisi dari NameValueCollection.

    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

Karena semua orang sepertinya menempelkan solusinya .. ini milik saya :-) Saya membutuhkan ini dari dalam perpustakaan kelas tanpa System.Web untuk mengambil parameter id dari hyperlink yang disimpan.

Saya pikir saya akan berbagi karena saya menemukan solusi ini lebih cepat dan lebih tampan.

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

Pemakaian:

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

Tekan Request.QueryString.Keys untuk NameValueCollection dari semua parameter string kueri.

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

Untuk mendapatkan semua nilai Querystring coba ini:

    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