2013-02-15 21 views
17

nicht zugewiesene Variable vorhanden ist Im Kontext einer ASP.NET-Seite kann ich Request.QueryString verwenden, um eine Auflistung der Schlüssel/Wert-Paare im Abfragezeichenfolgenabschnitt des URI abzurufen.Überprüfen, ob in Request.QueryString

Zum Beispiel, wenn ich meine Seite laden http://local/Default.aspx?test=value verwenden, dann kann ich den folgenden Code aufrufen:

//http://local/Default.aspx?test=value 

protected void Page_Load(object sender, EventArgs e) 
{ 
    string value = Request.QueryString["test"]; // == "value" 
} 

Im Idealfall, was ich tun möchte, ist zu überprüfen, um zu sehen, ob Test überhaupt existiert, so Ich kann die Seite unter Verwendung http://local/Default.aspx?test aufrufen und einen Boolean erhalten, der mir mitteilt, ob Test in der Abfragezeichenkette vorhanden ist. Etwas wie folgt aus:

//http://local/Default.aspx?test 

protected void Page_Load(object sender, EventArgs e) 
{ 
    bool testExists = Request.QueryString.HasKey("test"); // == True 
} 

So ideal, was ich will, ist ein boolescher Wert, der mir sagen, ob die Testvariable in der Zeichenfolge vorhanden ist oder nicht.

Ich nehme an, ich könnte einfach Regex verwenden, um die Zeichenfolge zu überprüfen, aber ich war neugierig, ob jemand eine elegantere Lösung hatte.

Ich habe versucht, die folgenden:

//http://local/Default.aspx?test 

Request.QueryString.AllKeys.Contains("test"); // == False (Should be true) 
Request.QueryString.Keys[0];     // == null (Should be "test") 
Request.QueryString.GetKey(0);    // == null (Should be "test") 

Dieses Verhalten unterscheidet sich als PHP, zum Beispiel, wo ich gerade

$testExists = isset($_REQUEST['test']); // == True 
+1

Warum können Sie nicht einfach nach einem 'null' suchen? 'If ​​(Request.QueryString [" test "]! = Null)' – JonH

+1

@JonH: Weil 'Request.QueryString [" test "]' 'null' zurückgibt, ob der Test in der Abfragekette vorhanden ist oder nicht. –

+0

nicht wahr? Ich bin mir nicht sicher, was Sie meinen, es wird nur == null zurückgeben, wenn es den Test in der Abfragezeichenfolge nicht sieht, andernfalls gibt es! = Null zurück, und wenn das der Fall ist, können Sie den Wert von test ergreifen. Ich sehe das Problem nicht. – JonH

Antwort

25

Request.QueryString.GetValues(null) wird eine Liste der Schlüssel ohne Werte erhalten

Request.QueryString.GetValues(null).Contains("test") wird return true

+1

Du hast mich nur um ein paar Sekunden geschlagen :-) Ich musste in den Quellcode schauen, um dieses seltsame Verhalten zu entdecken. –

+0

Ich bekomme eine 'System.ArgumentNullException: Wert kann nicht null sein. 'Fehler damit. – Dementic

+0

Ich bekomme auch den Fehler System.ArgumentNullException: Wert kann nicht null sein. – tkahn

2

Request.QueryString ist ein NameValueCollection verwenden können, aber Elemente werden nur hinzugefügt wenn der Abfrage-String im üblichen Format [name=value]* ist. Wenn nicht, ist es leer.

Wenn Ihr QueryString von der Form ?test=value war, dann würde Request.QueryString.AllKeys.Contains("test") tun, was Sie wollen. Andernfalls bleiben Sie bei der Ausführung von Zeichenfolgenoperationen auf Request.Url.Query stecken.

5

ich eine Erweiterung Methode, um diese Aufgabe zu lösen, schrieb:

public static bool ContainsKey(this NameValueCollection collection, string key) 
{ 
    if (collection.AllKeys.Contains(key)) 
     return true; 

    // ReSharper disable once AssignNullToNotNullAttribute 
    var keysWithoutValues = collection.GetValues(null); 
    return keysWithoutValues != null && keysWithoutValues.Contains(key); 
} 
+0

+1 große Antwort: Ab R # 8 brauchen Sie nicht mehr den Deaktivierungshinweis, es scheint, dass sie ihre Analyse von 'GetValues ​​(null)' aktualisiert haben.Eine andere Sache, die ich hervorheben kann, vergessen Sie nicht die Überladung ' Enthält (key, StringComparer.OrdinalIgnoreCase) 'um Groß-/Kleinschreibung zu vermeiden –

-1
Request.QueryString.ToString().Contains("test") 

Das in Arbeit Sonderfall, in dem Sie nach einem einzelnen Querystring-Parameter suchen, z MyFile.aspx?test

Für komplexere, allgemeine Fälle wären dann andere Lösungen besser.

+1

Hmmm ... es könnte funktionieren, aber es ist nicht sehr zuverlässig, es würde keinen vernünftigen Komponententest bestehen. Die akzeptierte Antwort ist immer noch die beste. Ich wollte Prüfen Sie, ob der Query-String eine Variable mit dem Namen 'test' enthält (ob er einen Wert enthält - zum Beispiel:'? test' oder '? test = anyvalue' gibt beide' true' zurück. Prüfen, ob der String 'test ' exists * anywhere * in der Querystring könnte falsch positive Ergebnisse liefern. Zum Beispiel: '? A = test '- der Variablenname ist' a', was ich nicht suche. Auch "? Bestest = 10" würde ein falsch positives Ergebnis liefern. –

+0

Guter Punkt, obwohl für meinen Anwendungsfall war es in Ordnung. Ich nehme an, man könnte eine Regex auf die rohe Querystring werfen. – GlennG

+1

Beispiel Regex: (? GlennG

2

Ich benutze dies.

if (Request.Params["test"] != null) 
{ 
    //Is Set 
} 
else if(Request.QueryString.GetValues(null) != null && 
     Array.IndexOf(Request.QueryString.GetValues(null),"test") > -1) 
{ 
    //Not set 
} 
else 
{ 
    //Does not exist 
}