En mi anterior post (Expresiones $ en ASP.NET 2.0) explicaba cómo utilizar las expresiones estándar de tipo $ en el HTML de las páginas ASP.NET 2.0. Ahora vamos a aprender a crear nuestras propias expresiones $ personales.
TEORÍA:
Para crear nuestra propia expresión $ debemos definir una nueva clase que herede de System.Web.Compilation.ExpressionBuilder. Lo mejor que podemos hacer es crearla dentro de App_Code de forma que se compilará automáticamente cuando se ejecute la aplicación ASP.NET. Al heredar de ExpressionBuilder nuestra clase debe sobreescribir el método GetCodeExpression de esta clase base. Este método se llama desde el compilador dinámico de ASP.NET al compilar la página que contiene nuestra etiqueta $ para que le devuelva la expresión que debe visualizar o asignar. De los parámetros de este método el más interesante es Entry, que es del tipo BoundPropertyEntry y que tiene una propiedad llamada Expression que nos da la expresión que se pretende evaluar. Una vez creada esta clase hay que registrar en web.config para poder usarla en nuestro sitio Web.
PRÁCTICA:
Bueno, después de esta breve teoría vamos a ver cómo se hace en la práctica. Vamos a crear una etiqueta $ que nos sirva para visualizar la fecha actual de diversas maneras. De este modo para que en una página nuestra aparezca una fecha o una hora podremos escribir alguna de estas expresiones:
<%$ Tiempo:FechaCorta %>
<%$ Tiempo:FechaLarga %>
<%$ Tiempo:Hora %>
Se trata de un ejemplo sencillo pero nos servirá muy bien para aprender a construir otras expresiones mucho más complejas pues se hace dela misma manera.
1.- Construir la clase heredada de ExpressionBuilder.
Dentro de la carpeta App_Code creamos un archivo ExtensionHoraria.cs que sobreescribe el método GetCodeExpression así:
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
string comando = entry.Expression;
string res = "";
switch(comando.ToLower())
{
case "fechacorta":
res = DateTime.Now.ToString("d");
break;
case "fechalarga":
res = DateTime.Now.ToString("D");
break;
case "hora":
res = DateTime.Now.ToString("t");
break;
}
return new CodePrimitiveExpression(res);
}
Nótese que lo que se debe devolver es un objeto de tipo CodePrimitiveExpression definido dentro del espacio de nombres System.CodeDom. Al constructor de esta clase se le pasa la cadena con el resultado a devolver.
2.- Registrar la expresión dentro del sistema de compilación de ASP.NET.
Para ello basta con añadir un nuevo nodo dentro de <compilation/> en web.config, que en este caso quedaría así:
<compilation debug="true">
<expressionBuilders>
<add expressionPrefix="Tiempo" type="ExtensionHoraria"/>
</expressionBuilders>
</compilation>
Lo primero destacado en negrita define el prefijo que se usará en la expresión $, es decir, lo que va justo delante de los dos puntos en ésta. Lo segundo define el nombre del tipo que implementa la expresión, o sea, el nombre de la clase que hemos definido en el paso anterior.
Ya está. Si ahora colocamos un control en el formulario poemos asignar a cualquiera de sus propiedades una de las tres expresiones $ que hemos definido con este código.
En este archivo comprimido (2,73 KB) he incluído el ejemplo concreto creado con Visual Web Developer 2005 Express Edition, para que lopuedas probar y ver con calma en tu equipo.
Las posibilidades de este tipo de expresiones son enormes y nos pueden ahorrar cantidad de código para tareas comunes. Cada uno seguro que le encuentra sus propias aplicaciones. Si alguien hace chulo con esto, por favor, que me lo mande y, si quiere, lo compartimos aquí.