Ben gibi bir dize ayrıştırmak istiyoruz p1=6&p2=7&p3=8
a içine NameValueCollection
.
Page.Request
Nesneye erişiminiz olmadığında bunu yapmanın en zarif yolu nedir ?
Ben gibi bir dize ayrıştırmak istiyoruz p1=6&p2=7&p3=8
a içine NameValueCollection
.
Page.Request
Nesneye erişiminiz olmadığında bunu yapmanın en zarif yolu nedir ?
Yanıtlar:
Bunun için yerleşik bir .NET yardımcı programı vardır: HttpUtility.ParseQueryString
// C#
NameValueCollection qscoll = HttpUtility.ParseQueryString(querystring);
' VB.NET
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)
Sen değiştirmeniz gerekebilir querystring
ile new Uri(fullUrl).Query
.
HttpUtility.ParseQueryString
HttpUtility.ParseQueryString("&X=1&X=2&X=3")
sonuç durumunda ....X=1,2,3...
aynı adda birden fazla parametre olması nadir olmakla birlikte int [], IEnumerable <int> vb. MS sitesine göre bkz. "Aynı sorgu dizesi değişkeninin birden çok örneği bir girişte birleştirilir" . Yöntemin el işi bir versiyonu tek seçeneğiniz olabilir
HttpUtility.ParseQueryString, bir web uygulamasında olduğunuz sürece veya System.Web'e bağımlılık eklemenin bir sakıncası yoksa ç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);
}
}
?foo=1&bar
. HttpUtility
ayrıştırmak istiyorum{ key = null, value = "bar" }
Yanıtların çoğu, kabul edilen yanıtın System.Web'e bağımlılığı nedeniyle özel örnekler vermektedir . Gönderen Microsoft.AspNet.WebApi.Client Nuget paketinin bir var UriExtensions.ParseQueryString da kullanılabilir, yöntem:
var uri = new Uri("https://stackoverflow.com/a/22167748?p1=6&p2=7&p3=8");
NameValueCollection query = uri.ParseQueryString();
System.Web bağımlılığından kaçınmak ve kendi başınızı döndürmek istemiyorsanız, bu iyi bir seçenektir.
Önkoşullar "Yalnızca istemci Framework Alt Kümesi" ile sınırlıyken, bir ClickOnce dağıtımının sorgu dizesini ayrıştırmak böylece 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;
}
OLSC sorguları ile çalışırken sağlanandan biraz daha yönlü bir fonksiyona ihtiyacım vardı.
İş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
<Extension()>
Yeteneği Uri'nin kendisine eklemek için bunun üstesinden gelmek kötü bir fikir olmayabilir .
Bunu System.Web
kendiniz yazmadan ve ek NuGet paketleri olmadan yapmak için:
System.Net.Http.Formatting
using System.Net.Http;
Bu kodu kullanın:
new Uri(uri).ParseQueryString()
https://msdn.microsoft.com/en-us/library/system.net.http.uriextensions(v=vs.118).aspx
Kullanmak için gereklidir System.Web bağımlılığını önlemek istiyorsanız HttpUtility.ParseQueryString şunu kullanabilirsiniz Uri
uzatma yöntemi ParseQueryString
bulundu System.Net.Http
.
System.Net.Http
Projenize bir referans (daha önce yapmadıysanız) eklediğinizden emin olun .
Yanıt gövdesini (in ) çalışacak Uri
şekilde geçerli bir biçime dönüştürmeniz gerektiğini unutmayın .ParseQueryString
System.Net.Http
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 ] );
}
}
}
Sadece fark Web API Müşteri bir sahip ParseQueryString
uzatma yöntemi bir üzerinde çalışır Uri
ve getiri a HttpValueCollection
:
var parameters = uri.ParseQueryString();
string foo = parameters["foo"];
HttpUtility.ParseQueryString(Request.Url.Query)
dönüş HttpValueCollection
(iç sınıf). Oradan miras alır 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);
Bunu Mono'nun kaynak kodundan birlikte çırptım . HttpUtility ve tüm bağımlılıklarını içerir (IHtmlString, Helpers, HttpEncoder, HttpQSCollection gibi).
Sonra kullanın HttpUtility.ParseQueryString
.
https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c
Herkes onun çözüm yapıştırma gibi görünüyor .. İşte benim :-) Ben System.Web
saklanan köprüler id parametreleri getirmeden bir sınıf kitaplığı içinde bu gerekli .
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")
Tüm sorgu dizesi parametrelerinin NameValueCollection için Request.QueryString.Keys tuşuna basın.
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
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;
}
Ben VB josh-brown C # sürümüne çevirmek
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;
}
Bu benim kod, çok yararlı olduğunu düşünüyorum:
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;
}