it-swarm.com.de

Analysieren einer Abfragezeichenfolge in eine NameValueCollection in .NET

Ich möchte einen String wie p1=6&p2=7&p3=8 In einen NameValueCollection zerlegen.

Was ist die eleganteste Methode, wenn Sie keinen Zugriff auf das Objekt Page.Request Haben?

181
Nathan Smith

Dafür gibt es ein eingebautes .NET-Dienstprogramm: HttpUtility.ParseQueryString

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

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

348
Guy Starbuck

HttpUtility.ParseQueryString funktioniert, solange Sie sich in einer Webanwendung befinden oder eine Abhängigkeit von System.Web berücksichtigen. 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);
   }
}
43
Scott Dorman

Viele der Antworten enthalten benutzerdefinierte Beispiele, da die akzeptierte Antwort von System.Web abhängt. Aus dem Paket Microsoft.AspNet.WebApi.Client NuGet gibt es die Methode riExtensions.ParseQueryString , die auch verwendet werden kann:

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

Wenn Sie also die System.Web - Abhängigkeit vermeiden und nicht Ihre eigene rollen möchten, ist dies eine gute Option.

25
James Skimming

Ich wollte die Abhängigkeit von System.Web entfernen, damit ich die Abfragezeichenfolge einer ClickOnce-Bereitstellung analysieren und gleichzeitig die Voraussetzungen auf die "Nur-Client-Framework-Teilmenge" beschränken kann.

Ich mochte die Antwort von RP. Ich habe eine zusätzliche Logik hinzugefügt.

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

Ich brauchte eine Funktion, die etwas vielseitiger ist als die, die bereits bei der Arbeit mit OLSC-Abfragen zur Verfügung gestellt wurde.

  • Werte können mehrere Gleichheitszeichen enthalten
  • Dekodiere kodierte Zeichen in Name und Wert
  • Kann auf Client Framework ausgeführt werden
  • Kann auf Mobile Framework ausgeführt werden.

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 ist vielleicht keine schlechte Idee, <Extension()> auch hier anzupacken, um die Fähigkeit zu Uri selbst hinzuzufügen.

7
Josh Brown

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

  1. Verweis auf System.Net.Http.Formatting Hinzufügen
  2. Addiere using System.Net.Http;
  3. Verwenden Sie diesen Code:

    new Uri(uri).ParseQueryString()
    

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

7
jvenema

Ich habe gerade festgestellt, dass Web-API-Client eine ParseQueryString -Erweiterungsmethode hat, die auf einem Uri funktioniert und ein HttpValueCollection zurückgibt:

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

Wenn Sie die Abhängigkeit von System.Web vermeiden möchten, die für die Verwendung von HttpUtility.ParseQueryString erforderlich ist, können Sie die Uri -Erweiterungsmethode ParseQueryString verwenden, die sich in System.Net.Http.

Stellen Sie sicher, dass Sie in Ihrem Projekt einen Verweis auf System.Net.Http Hinzufügen (falls Sie dies noch nicht getan haben).

Beachten Sie, dass Sie den Antworttext in einen gültigen Uri konvertieren müssen, damit 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();
2
    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.

Greifen Sie einfach auf Request.QueryString zu. AllKeys, das als weitere Antwort erwähnt wird, bietet Ihnen nur eine Reihe von Schlüsseln.

1
Bloodhound

Wenn Sie die System.Web-Abhängigkeit nicht möchten, fügen Sie einfach diesen Quellcode aus der HttpUtility-Klasse ein.

Ich habe das gerade aus dem Quellcode von Mono zusammengepeitscht. Es enthält das HttpUtility und alle Abhängigkeiten (wie IHtmlString, Helpers, HttpEncoder, HttpQSCollection).

Dann benutze HttpUtility.ParseQueryString.

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

1
user3638471

HttpUtility.ParseQueryString(Request.Url.Query) return ist HttpValueCollection (interne Klasse). Es 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); 
1
alex1kirch

Da jeder seine Lösung einzufügen scheint .. hier ist meine :-) Ich brauchte diese aus einer Klassenbibliothek ohne System.Web, um ID-Parameter von gespeicherten Hyperlinks abzurufen.

Dachte, ich würde teilen, weil ich diese Lösung schneller finde und besser aussehe.

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

Verwendung:

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

Rufen Sie Request.QueryString.Keys auf, um eine NameValueCollection aller Abfragezeichenfolgenparameter zu erhalten.

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

So erhalten Sie alle Querystring-Werte:

    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