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?test
et 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
Request.QueryString.GetValues(null)
obtiendra une liste de clés sans valeur
Request.QueryString.GetValues(null).Contains("test")
retournera true
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);
}
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
}
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
.