2013-02-15 21 views
17

Nel contesto di una pagina ASP.NET, posso utilizzare Request.QueryString per ottenere una raccolta delle coppie chiave/valore nella parte della stringa di query dell'URI.Verificare se esiste una variabile non assegnata in Request.QueryString

Per esempio, se io carico la mia pagina utilizzando http://local/Default.aspx?test=value, allora posso chiamare il seguente codice:

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

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

Idealmente quello che voglio fare è controllare per vedere se prova esiste affatto, in modo Posso chiamare la pagina utilizzando http://local/Default.aspx?test e ottenere un valore booleano che indica se il test esiste nella stringa di query. Qualcosa di simile a questo:

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

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

Quindi idealmente quello che voglio è un valore booleano che mi dica se la variabile di test è presente nella stringa o meno.

Suppongo che potrei usare la regex per controllare la stringa, ma ero curioso se qualcuno avesse una soluzione più elegante.

ho provato la seguente:

//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") 

Questo comportamento è diverso da PHP, per esempio, dove posso basta usare

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

Perché non è possibile controllare un 'nullo'? 'If ​​(Request.QueryString [" test "]! = Null)' – JonH

+1

@JonH: Poiché 'Request.QueryString [" test "]' restituisce 'null' se il test è presente nella stringa di query oppure no. –

+0

eh? Non sono sicuro di cosa intendi, restituirà solo == null se non vede il test nella stringa di query altrimenti restituisce! = Null, e se questo è il caso puoi prendere il valore del test. Non vedo il problema. – JonH

risposta

25

Request.QueryString.GetValues(null) otterrà un elenco di chiavi senza valori

Request.QueryString.GetValues(null).Contains("test") restituirà true

+1

Mi hai battuto di pochi secondi :-) Ho dovuto dare un'occhiata al codice sorgente per scoprire questo strano comportamento. –

+0

ottengo un errore "System.ArgumentNullException: Valore non può essere nullo" con questo. – Dementic

+0

Ho anche ricevuto l'errore System.ArgumentNullException: il valore non può essere nullo. – tkahn

2

Request.QueryString è un NameValueCollection, ma gli elementi vengono aggiunti solo ad esso se la stringa di query è nel solito formato [name=value]*. In caso contrario, è vuoto.

Se il tuo QueryString era del formato ?test=value, quindi Request.QueryString.AllKeys.Contains("test") farebbe quello che vuoi. Altrimenti, sei bloccato a fare operazioni con le stringhe su Request.Url.Query.

5

ho scritto un metodo di estensione per risolvere questo compito:

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 ottima risposta: a partire da R # 8 non hai più bisogno del suggerimento di disabilitazione, sembra che abbiano aggiornato la loro analisi di 'GetValues ​​(null)." Un'altra cosa che posso sottolineare, non dimenticare il sovraccarico ' Contiene (key, StringComparer.OrdinalIgnoreCase) 'per evitare la distinzione tra maiuscole e minuscole. –

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

Questo funziona in caso speciale in cui stai cercando un parametro di querystring singolo, ad es MyFile.aspx?test

Per i casi più complessi e generici, allora le soluzioni sarebbero migliori.

+1

Hmmm ... potrebbe funzionare, ma non è molto affidabile, non supererebbe un test di unità decente.La risposta accettata è ancora la migliore. verifica se la stringa di query contenesse una variabile chiamata 'test' (indipendentemente dal fatto che contenesse o meno un valore - ad esempio:'? test' o '? test = anyvalue' entrambi restituiscono' true'). Verifica per vedere se la stringa 'test ' esiste * ovunque * nella querystring potrebbe produrre falsi positivi. Ad esempio: '? A = test' - il nome della variabile è' a', che non è quello che sto cercando. Anche '? Bestest = 10' produrrebbe un falso positivo. –

+0

Buon punto anche se per il mio caso d'uso andava bene. Suppongo che si possa lanciare un'espressione regolare alla querystring grezza. – GlennG

+1

Esempio regex: (? GlennG

2

Io uso questo.

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 
} 
Problemi correlati