martes, mayo 31, 2005

Obteniendo valores por QueryString

En el post anterior hablamos de zonas de riesgo y de que debemos verificar los datos que nuestra aplicación recibe de los usuarios. También mencionamos que es mucho el código adicional que debemos escribir si necesitamos verificar muchos datos y que deberíamos abstraer esa problemática. Pues bien, ahora vamos a ver un ejemplo de cómo hacer esto.

El problema que intentamos resolver es el siguiente. Nuestra aplicación presenta un listado en varias páginas y obtiene el número de página que debe mostrar a través del parámetro “pagina” pasado por QueryString. En un punto del código, necesito obtener un valor entero y en caso de no conseguirlo, el valor debe ser “1”, es decir, la primera página.


using System;
using System.Web;

namespace DWP.Web
{
/// Definimos la clase como sellada
/// para impedir la herencia

public sealed class Requester
{
/// Constructor privado para impedir
/// la creación de instancias.

private Requester(){}

/// Método estático para obtener
/// parámetros por QueryString

public static object FromQueryString(string key, object defaulValue)
{
/// Obtenemos el objeto Request actual
HttpRequest Request = HttpContext.Current.Request;
object o;
string val = "";

/// Verificamos si el valor existe
/// en el QueryString. Si no, devolvemos
/// el valor por default

if (Request.QueryString[key]!=null && Request.QueryString[key].ToString()!="") {
val = Request.QueryString[key].ToString();
} else {
return defaulValue;
}

/// Intentamos convertir el valor obtenido
/// al tipo de dato del valor default.
/// Si esto da error, devolvemos el
/// valor default.

try {
o = Convert.ChangeType(val, defaulValue.GetType());
} catch {
o = defaulValue;
}
return o;
}
}
}


Como podemos ver, el método “FromQueryString” tiene como tipo de retorno un object. Necesitamos que sea así porque vamos a devolver un objeto de tipo similar al valor por default. De esta forma, si estamos esperando un entero y por QueryString nos llegó un texto, el método devuelve el valor predeterminado, es decir, garantiza el tipo de dato devuelto.

Las siguientes son formas válidas de utilizar nuestra función:
///Esperamos un entero, si no, devuelve el valor 1.
int currPage = (int)Requester.FromQueryString("pagina",1);

///Esperamos una fecha, si no, 1 de enero de 2005.
DateTime currDate = (DateTime)Requester.FromQueryString("fecha", new DateTime(2005,01,01));


Les dejo a ustedes la tarea de crear los métodos que obtienen valores por Form y Cookies.