Frage

Ich möchte eine Zeichenfolge wie p1=6&p2=7&p3=8 in eine NameValueCollection analysieren.

Was ist die eleganteste Art und Weise, dies zu tun, wenn Sie keinen Zugriff auf das Page.Request Objekt?

War es hilfreich?

Lösung

Es gibt einen integrierten .NET-Dienstprogramm für diese: HttpUtility.ParseQueryString

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

Sie müssen möglicherweise querystring mit new Uri(fullUrl).Query ersetzen.

Andere Tipps

HttpUtility.ParseQueryString funktioniert, solange Sie in einem Web-App sind oder nicht dagegen, eine Abhängigkeit von System.Web einschließlich. Ein anderer Weg, dies zu tun ist:

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

Viele der Antworten bieten individuelle Beispiele wegen der Abhängigkeit der akzeptierten Antwort auf Microsoft.AspNet.WebApi.Client NuGet Paket gibt es eine < a href = "http://msdn.microsoft.com/en-us/library/system.net.http.uriextensions.parsequerystring.aspx" rel = "noreferrer"> UriExtensions.ParseQueryString , Methode dass auch verwendet werden:

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

Also, wenn Sie die System.Web Abhängigkeit und wollen nicht Ihre eigene Rolle, ist dies eine gute Wahl.

Ich wollte die Abhängigkeit von System.Web entfernen, so dass ich die Query-String einer Clickonce-Bereitstellung analysieren könnte, während die Voraussetzungen an den „Client-only Framework-Subset“ beschränkt ist.

Ich mochte rp Antwort. Ich habe einige zusätzliche Logik.

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

Ich brauchte eine Funktion, die ein wenig vielseitiger als das, was bereits zur Verfügung gestellt, wenn sie mit OLSC Abfragen arbeiten.

  • Die Werte können mehrere Gleichheitszeichen enthalten
  • Decode codierte Zeichen in beiden Namen und den Wert
  • lauffähig auf Client Framework
  • Fähig zu Mobile Rahmen ausgeführt wird.

Hier ist meine Lösung:

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

Es kann keine schlechte Idee sein <Extension()> auf das auch heften sich die Fähigkeit, Uri hinzuzufügen.

Um dies zu tun, ohne System.Web, ohne es selbst zu schreiben und ohne zusätzliche NuGet Pakete:

  1. eine Referenz In den System.Net.Http.Formatting
  2. Fügen Sie using System.Net.Http;
  3. Mit diesem Code:

    new Uri(uri).ParseQueryString()
    

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

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

Ich habe erkannt, dass Web-API-Client eine ParseQueryString Erweiterung Verfahren, die auf einem Uri arbeitet und gibt einen HttpValueCollection:

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

Wenn Sie die Abhängigkeit von System.Web vermeiden wollen, die HttpUtility.ParseQueryString , könnten Sie die Uri Erweiterungsmethode ParseQueryString in System.Net.Http gefunden verwenden.

Stellen Sie sicher, einen Verweis auf (wenn Sie nicht bereits haben) in Ihrem Projekt System.Net.Http.

Beachten Sie, dass Sie den Antworttext auf eine gültige Uri konvertieren, so dass ParseQueryString (in System.Net.Http) funktioniert.

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

Just Zugang Request.QueryString. AllKeys erwähnt als eine andere Antwort bekommt man nur eine Reihe von Schlüsseln.

HttpUtility.ParseQueryString(Request.Url.Query) Rückkehr HttpValueCollection (interne Klasse). Sie erbt von 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); 

Wenn Sie nicht die System.Web Abhängigkeit wollen, fügen Sie einfach diesen Quellcode von HttpUtility Klasse.

ich gepeitscht gerade diese zusammen aus dem Quellcode von Mono . Es enthält die HttpUtility und all seinen Abhängigkeiten (wie IHtmlString, Helfer, HttpEncoder, HttpQSCollection).

Dann Verwendung HttpUtility.ParseQueryString.

https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c

Da jeder seine Lösung zu kleben scheint .. hier ist meins :-) Ich brauchte diese innerhalb einer Klassenbibliothek ohne System.Web zu id-Parameter von gespeicherten Hyperlinks abgerufen werden.

Ich dachte, ich würde Aktie, weil ich diese Lösung schneller und besser finden suchen.

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

Verbrauch:

Statics.QueryGet(url, "id")

Hit up Request.QueryString.Keys für eine Namevaluecollection aller Query-String-Parameter.

Um alle Abfragezeichen Werte versuchen Sie dies:

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

ich zu C # Version von josh-braun in VB übersetzen

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

Das ist mein Code, ich denke, es ist sehr nützlich:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top