c# - Compruebe si existe una variable no asignada en Request.QueryString
asp.net .net-3.5 (5)
Escribí un método de extensión para resolver esta tarea:
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);
}
Dentro del contexto de una página ASP.NET, puedo usar Request.QueryString para obtener una colección de los pares clave / valor en la parte de la cadena de consulta del URI.
Por ejemplo, si carga mi página usando http://local/Default.aspx?test=value
, entonces puedo llamar al siguiente código:
//http://local/Default.aspx?test=value
protected void Page_Load(object sender, EventArgs e)
{
string value = Request.QueryString["test"]; // == "value"
}
Idealmente, lo que quiero hacer es verificar si existe alguna prueba , para poder llamar a la página usando http://local/Default.aspx?test
y obtener un booleano que me diga si existe una prueba en la cadena de consulta. Algo como esto:
//http://local/Default.aspx?test
protected void Page_Load(object sender, EventArgs e)
{
bool testExists = Request.QueryString.HasKey("test"); // == True
}
Entonces, idealmente, lo que quiero es un valor booleano que me diga si la variable de prueba está presente en la cadena o no.
Supongo que podría usar expresiones regulares para verificar la cadena, pero tenía curiosidad por si alguien tuviera una solución más elegante.
He intentado lo siguiente:
//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")
Este comportamiento es diferente a PHP, por ejemplo, donde solo puedo usar
$testExists = isset($_REQUEST[''test'']); // == True
Yo uso esto.
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.GetValues(null)
obtendrá una lista de claves sin valores
Request.QueryString.GetValues(null).Contains("test")
devolverá true
Request.QueryString
es un NameValueCollection
, pero los elementos solo se le agregan si la cadena de consulta está en el formato habitual [name=value]*
. Si no, está vacío.
Si su QueryString
tenía el formato ?test=value
, entonces Request.QueryString.AllKeys.Contains("test")
haría lo que usted desea. De lo contrario, está atascado haciendo operaciones de cadena en Request.Url.Query
.
Request.QueryString.ToString().Contains("test")
Esto funciona en el caso especial en el que está buscando un único parámetro de cadena de consulta, por ejemplo, MyFile.aspx?test
Para casos más complejos, generales, entonces otras soluciones serían mejores.