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 Page.Request
objek?
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 Page.Request
objek?
Jawaban:
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
.
HttpUtility.ParseQueryString
akan menjadi rekomendasi saya kecuali bahwa dalam kasus HttpUtility.ParseQueryString("&X=1&X=2&X=3")
hasilnya adalah ....X=1,2,3...
Memiliki beberapa params dengan nama yang sama tidak umum tetapi diperlukan untuk mendukung parameter pengontrol seperti int [], IEnumerable <int> dll (param tersebut dapat digunakan untuk mendukung beberapa kotak centang) lihat "Beberapa kemunculan variabel string kueri yang sama dikonsolidasikan dalam satu entri" sesuai situs MS . Versi buatan tangan dari metode ini mungkin satu-satunya pilihan Anda
HttpUtility.ParseQueryString akan bekerja selama Anda berada di aplikasi web atau tidak keberatan termasuk 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);
}
}
?foo=1&bar
. HttpUtility
akan menguraikannya sebagai{ key = null, value = "bar" }
Banyak jawaban yang memberikan contoh khusus karena ketergantungan jawaban yang diterima pada System.Web . Dari paket NuGet Microsoft.AspNet.WebApi.Client ada UriExtensions.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 ketergantungan System.Web dan tidak ingin menjalankannya sendiri, ini adalah opsi yang baik.
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;
}
Saya membutuhkan fungsi yang sedikit lebih fleksibel daripada apa yang sudah disediakan saat bekerja dengan permintaan OLSC.
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
Mungkin bukan ide yang buruk <Extension()>
untuk memperbaikinya juga untuk menambah kemampuan Uri itu sendiri.
Untuk melakukannya tanpa System.Web
, tanpa menulis sendiri, dan tanpa paket NuGet tambahan:
System.Net.Http.Formatting
using System.Net.Http;
Gunakan kode ini:
new Uri(uri).ParseQueryString()
https://msdn.microsoft.com/en-us/library/system.net.http.uriextensions(v=vs.118).aspx
Jika Anda ingin menghindari ketergantungan pada System.Web yang diperlukan untuk menggunakan HttpUtility.ParseQueryString , Anda bisa menggunakan Uri
metode ekstensi yang ParseQueryString
ditemukan diSystem.Net.Http
.
Pastikan untuk menambahkan referensi (jika Anda belum) ke System.Net.Http
dalam proyek Anda.
Perhatikan bahwa Anda harus mengonversi badan respons ke valid Uri
agar ParseQueryString
(in 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();
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 ] );
}
}
}
Saya baru menyadari bahwa Web API Client memiliki ParseQueryString
metode ekstensi yang berfungsi pada Uri
dan mengembalikan HttpValueCollection
:
var parameters = uri.ParseQueryString();
string foo = parameters["foo"];
Cukup akses Request.QueryString. AllKeys disebut sebagai jawaban lain hanya memberi Anda berbagai kunci.
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);
Saya baru saja mencabut ini bersama-sama dari kode sumber Mono . Ini berisi HttpUtility dan semua dependensinya (seperti IHtmlString, Helpers, HttpEncoder, HttpQSCollection).
Lalu gunakanHttpUtility.ParseQueryString
.
https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c
Karena semua orang sepertinya menempelkan solusinya .. ini milik saya :-) Saya membutuhkan ini dari dalam perpustakaan kelas tanpa System.Web
mengambil parameter id dari hyperlink yang tersimpan.
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")
Tekan Request.QueryString.Keys untuk NameValueCollection dari semua parameter string kueri.
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
var q = Request.QueryString;
NameValueCollection qscoll = HttpUtility.ParseQueryString(q.ToString());
let search = window.location.search;
console.log(search);
let qString = search.substring(1);
while(qString.indexOf("+") !== -1)
qString = qString.replace("+", "");
let qArray = qString.split("&");
let values = [];
for(let i = 0; i < qArray.length; i++){
let pos = qArray[i].search("=");
let keyVal = qArray[i].substring(0, pos);
let dataVal = qArray[i].substring(pos + 1);
dataVal = decodeURIComponent(dataVal);
values[keyVal] = dataVal;
}
Saya menerjemahkan ke versi C # josh-brown di VB
private System.Collections.Specialized.NameValueCollection ParseQueryString(Uri uri)
{
var result = new System.Collections.Specialized.NameValueCollection(4);
var query = uri.Query;
if (!String.IsNullOrEmpty(query))
{
var pairs = query.Substring(1).Split("&".ToCharArray());
foreach (var pair in pairs)
{
var parts = pair.Split("=".ToCharArray(), 2);
var name = System.Uri.UnescapeDataString(parts[0]);
var value = (parts.Length == 1) ? String.Empty : System.Uri.UnescapeDataString(parts[1]);
result.Add(name, value);
}
}
return result;
}
Ini kode saya, saya pikir ini sangat berguna:
public String GetQueryString(string ItemToRemoveOrInsert = null, string InsertValue = null )
{
System.Collections.Specialized.NameValueCollection filtered = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (ItemToRemoveOrInsert != null)
{
filtered.Remove(ItemToRemoveOrInsert);
if (!string.IsNullOrWhiteSpace(InsertValue))
{
filtered.Add(ItemToRemoveOrInsert, InsertValue);
}
}
string StrQr = string.Join("&", filtered.AllKeys.Select(key => key + "=" + filtered[key]).ToArray());
if (!string.IsNullOrWhiteSpace(StrQr)){
StrQr="?" + StrQr;
}
return StrQr;
}