web-dev-qa-db-fra.com

Vérifier si une variable non affectée existe dans Request.QueryString

Dans le contexte d'une page ASP.NET, je peux utiliser Request.QueryString pour obtenir une collection des paires clé/valeur dans la partie chaîne de requête de l'URI.

Par exemple, si je charge ma page en utilisant http://local/Default.aspx?test=value, je peux appeler le code suivant:

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

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

Idéalement, ce que je veux faire est de vérifier si test existe, afin que je puisse appeler la page à l'aide de http://local/Default.aspx?testet obtenir un booléen m'indiquant si le test existe dans la chaîne de requête. Quelque chose comme ça:

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

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

Donc, idéalement, ce que je veux, c'est une valeur booléenne qui me dise si la variable de test est présente dans la chaîne ou non.

Je suppose que je pourrais simplement utiliser regex pour vérifier la chaîne, mais j'étais curieux de savoir si quelqu'un avait une solution plus élégante.

J'ai essayé ce qui suit:

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

Ce comportement est différent de PHP, par exemple, où je peux simplement utiliser

$testExists = isset($_REQUEST['test']); // == True
18
Aaron Blenkush

Request.QueryString.GetValues(null) obtiendra une liste de clés sans valeur

Request.QueryString.GetValues(null).Contains("test") retournera true

25
Joe

J'ai écrit une méthode d'extension pour résoudre cette tâche:

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);
}
5
Dark Daskin

Je l'utilise.

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
}
2
DTagg

Request.QueryString est une NameValueCollection, mais les éléments ne lui sont ajoutés que si la chaîne de requête est au format habituel [name=value]*. Sinon, il est vide. 

Si votre QueryString était de la forme ?test=value, alors Request.QueryString.AllKeys.Contains("test") ferait ce que vous voulez. Sinon, vous êtes bloqué à faire des opérations sur Request.Url.Query.

2
Oren Melzer