Creación de expresiones $ personalizadas


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í.

Expresiones $ en ASP.NET 2.0

Una de las nuevas características de ASP.NET 2.0 destinadas a reducir la cantidad de código de nuestros desarrollos son las expresiones de tipo $. Éstas nos permiten obtener directamente ciertos valores y funcionalidades desde dentro de la definición de la página, sin necesidad de escribir códigopara ello.


Su sintaxis es análogo a la siguiente:



<%$ Expresion:Accion %>


El uso típico de este tipo de expresiones es el de obtener directamente valores desde el archivo de configuración (web.config) y asignarlas directamente a propiedades de controles de la interfaz de usuario.


Por ejemplo:


<asp:Label Runat=»server»
  Text=»<%$ AppSettings:NombreEmpresa %>»


muestra el valor asignado al parámetro «NombreEmpresa» dentro de la configuración de la aplicación en web.config (<AppSettings/>).


También se pueden obtener valores de cadenas de conexión (ej: <%$ ConnectionStrings:MiConexion %>, ya que ahora hay una sección específica para ellas) o cosas que no tienen nada que ver con la configuración, como por ejemplo recursos dentro de archivos de recursos (ej: <%$ Resources:MisRecursos, Recurso1 %>).


Este tipo de expresiones tienen muchas posibilidades en todo lo que respecta a la interfaz de usuario y, sobre todo, nos pueden ahorran bastante escritura de código.


Lo que no todo el mundo sabe es que, además, es posible definir nuestras propias expresiones $. Se trata de una técnica llena de posibilidades. En el próximo «post» (mañana o pasado) mostraré cómo crear nuestras propias expresiones $ y colgaré un ejemplo con el código completo, así que ¡sigue atento a este blog!





Nota: Curiosamente la API que usamos en Krasis para aplicaciones con ASP 3.0 clásico tiene un tipo de expresión definida por nosotros que es exactamente igual a esta deASP.NET 2.0, sólo que sirve para más cosas y aemás nosotros llevamos usándola muchos años 😉