Control de servidor RollOver para ASP.NET

El RollOver es un efecto mediante el cual se muestra una imagen cuando el ratón se encuentra lejos, y otra imagen cuando el ratón se pasa sobre la imagen.

No existe un control de servidor en ASP.NET para crear un efecto RollOver. Para hacerlo tendríamos que añadir un control de tipo LinkButton y luego añadir algo de JavaScript mediante código de servidor. Suena muy complicado si tenemos, por ejemplo, una barra de navegación con varias opciones de menú.

Buscando en Google encontré este artículo de Scott Mitchell. Basándose en el concepto de herencia, se crea un nuevo control llamado RollOver que hace justamente lo que queremos.

No voy a entrar en los detalles de programación, porque los puedes leer en la liga antes mencionada, pero sí te voy a explicar cómo hacerlo funcionar en 1 minuto.

En la carpeta raíz de tu aplicación, crea un fólder llamado bin (si es que no lo tienes ya), y coloca ahí el archivo .dll que descargaste.

Listo, esta es toda la configuración que tienes que hacer, ahora, para utilizarlo tienes que registrarlo en cada una de las páginas en las que lo vayas a usar. Para hacerlo, pega esta línea al principio del código de tu página:

  1. <%@ Register TagPrefix="skm" Namespace="RolloverButton" Assembly="RolloverButton" %>

Y para usarlo, pega este código en el lugar donde quieras que aparezca el RollOver:

  1. <skm:RollOver
  2.        runat="server"
  3.        id="RollOver1"
  4.        ImageUrl="Images/Icono_Home.gif"
  5.        RollOverImageUrl="Images/Icono_HomeOn.gif"
  6.        PostBackUrl="Default.aspx"
  7.        Height="100px"
  8.        ToolTip="Ir a Inicio"
  9.        Width="100px" />
  • ImageUrl: Es la imagen que aparecerá cuando el ratón esté lejos.
  • RollOverImageUrl: Es la imagen que aparecerá cuando el ratón pase sobre el control.
  • PostBackUrl: Es la liga a la cual se llevará al hacer clic sobre la imagen.

Como otro ejemplo, te pongo el código de una página que se crea a partir de un MasterPage:

  1. <%@ Page Language="VB" MasterPageFile="~/Ppal.master"
  2.        AutoEventWireup="false" CodeFile="Tira.aspx.vb"
  3.        Inherits="Tira" title="Untitled Page" %>
  4.        
  5. <%@ Register TagPrefix="skm" Namespace="RolloverButton" Assembly="RolloverButton" %>
  6.  
  7. <asp:Content ID="Content1" ContentPlaceHolderID="Cuerpo" Runat="Server">
  8.  
  9.     <skm:RollOver
  10.            runat="server"
  11.            id="RollOver1"
  12.            ImageUrl="Images/Icono_Home.gif"
  13.            RollOverImageUrl="Images/Icono_HomeOn.gif"
  14.            PostBackUrl="Default.aspx"
  15.            Height="100px"
  16.            ToolTip="Ir a Inicio"
  17.            Width="100px" />
  18.     <br />
  19.  
  20. </asp:Content>

Nota: Este control no soporta el uso de la tilde (~) para designar al directorio raíz.

Los campos insertados se truncan en 1024 caracteres

Al crear un TableAdapter en una aplicación de ASP.NET 2 usando Visual Web Developer 2005 Express, se establecen algunos límites que no son obvios a primera vista.

En un proyecto en el que trabajo tengo una base de datos en MySQL con un campo llamado Cuerpo que es de tipo longtext y está diseñado para que pueda almacenar varios párrafos de HTML.

Al crear el TableAdapter y el Business Logic uno nunca establece los tamaños de los campos, ya que la herramienta lo hace por uno mismo.

En mi caso, al insertar un registro mediante mi aplicación, el campo Cuerpo se truncaba, almacenando únicamente alrededor de 1000 o 1024 caracteres.

Mi primera idea fue ir a revisar mi tabla de MySQL, pero el límite no estaba ahí. En seguida fui a ver las propiedades de la tabla en el TableAdapter de mi aplicación:

Propiedades

Como puedes ver, el MaxLength del campo en cuestión estaba establecido en 60,000, así que tampoco estaba ahí el problema. Después de un rato de darle vueltas al asunto, se me ocurrió ver las propiedades de la sentencia que hacía el insert en la base de datos, la cual en mi ejemplo se llama InsertaEnvio. Solamente hay que seleccionarla y oprimir el pequeño botón con tres puntos:

TableAdapter

Se mostrará la ventana de propiedades de la sentencia SQL. Seleccioné el campo problemático, y noté que en la propiedad Size tenía un valor de 1024:

Tamano del campo

Listo, ahí estaba el error, solamente lo modifiqué a un valor lo suficientemente grande:

Tamano modificado

Salve el archivo xsd, probé nuevamente, y el problema desapareció.

Establecer Title y añadir Metatags y scripts al elemento Head mediante programación

Es posible modificar el tag Title y añadir Metatags y otros elemenos al Head de nuestra página mediante el código de servidor.

Esto puede ser muy útil si estamos utilizando MasterPages. Añadimos el código una vez a nuestro MasterPage, y éste se encarga de colocar estos valores a lo largo de toda nuestra aplicación.

El código siguiente establece el título de la aplicación, crea un Metatag para Keywords, otro para Description y finalmente agrega la referencia a un archivo .js de JavaScript. Lo interesante de esto último es que mediante la función Page.ResolveUrl se genera dinámicamente la ruta del .js partiendo de la ruta raíz de la aplicación. Si existen páginas creadas a partir del MasterPage en diferentes niveles de carpeta (o si movemos la página a alguna subcarpeta) la ruta al script siempre se generará correctamente.

Este es el código:

  1. Page.Title = "Trebol, todo tipo de articulos de papeleria"
  2.  
  3. Dim PalabrasClave As New HtmlMeta()
  4. PalabrasClave.Name = "Keywords"
  5. PalabrasClave.Content = "colores, lapices, plumas"
  6.  
  7. Dim Descripcion As New HtmlMeta()
  8. Descripcion.Name = "Description"
  9. Descripcion.Content = "Articulos de papeleria"
  10.  
  11. Dim ScriptCambiadorEstilos As New HtmlGenericControl("script")
  12. ScriptCambiadorEstilos.Attributes.Add("type", "text/javascript")
  13. 'Recuerda que la tilde (~) indica la raiz de tu aplicacion
  14. ScriptCambiadorEstilos.Attributes.Add("src", Page.ResolveUrl("~/scripts/styleswitch.js"))
  15.  
  16. Dim Cabeza As HtmlHead = CType(Page.Header, HtmlHead)
  17. Cabeza.Controls.Add(PalabrasClave)
  18. Cabeza.Controls.Add(Descripcion)
  19. Cabeza.Controls.Add(ScriptCambiadorEstilos)

Es incorrecto utilizar una sección registrada como allowDefinition=’MachineToApplication’ mas allá del nivel de aplicación

Al tratar de compilar (Build) una aplicación de ASP.NET 2 aparece el siguiente error:

Error 1 Es incorrecto utilizar una sección registrada como allowDefinition='MachineToApplication' mas allá del nivel de aplicación. Este error puede tener como origen un directorio virtual que no esté configurado como aplicación en IIS. W:AmexCuestionarioClubVacacionesserverWeb.config 87

En inglés:

Parser Error Message: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

En mi caso esto se debía a que tenía un archivo web.config dentro de una subcarpeta de la aplicación raíz. Estaba guardando ese archivo como backup, y era lo que impedía que el proyecto se compilara, marcando el error anterior.

Tan pronto como lo renombré a web.config.txt desapareció el error.

Error de solicitud de permiso de tipo ‘System.Web.AspNetHostingPermission

Al trabajar en Visual Web Developer 2005 Express Edition (VWD) puedes obtener este error:

Error 18 Error de solicitud de permiso de tipo 'System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. (W:MiAplicacionweb.config line 46) W:MiAplicacionAdminDefault.aspx 3

En inglés:

Request for the permission of type 'System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

Este error aparece por cada uno de los controles que existan en cada una de las páginas. Si abres el code-behind de alguna página, notarás que los controles que aparecen en el correspondiente aspx no son reconocidos, por lo que el Intellisense no funciona y programar se vuelve medio imposible.

Esta situación puede ocurrir cuando se tiene una máquina para desarrollo y un servidor en la red local. La máquina del desarrollador se usa solamente para correr VWD y en el servidor se corre el IIS y se almacena la aplicación. El desarrollador mapea una letra a un recurso compartido (share) en el servidor, de tal manera que, por ejemplo, W: mapee a servidoraplicacion.

Debido a que estamos trabajando en un recurso compartido, se muestra el error anterior por cuestiones de seguridad.

Para resolverlo se debe hacer lo siguiente:

En la máquina del desarrollador, hay que abrir la herramienta Inicio -> Panel de Control -> Herramientas Administrativas -> Configuración de Microsoft .NET Framework 2.0:

Configuración de Microsoft .NET Framework 2.0

Después se debe expander el árbol para mostrar: Console Root -> .NET Framework 2.0 Configuration -> My Computer -> Runtime Security Policy y hacer clic en la liga que dice: Adjust Zone Security:

Security Adjustment Wizard

Dejar marcada la opción Make changes to this computer y dar clic en siguiente. En la pantalla que aparece se debe seleccionar la opción Local Intranet y ajustar el selector a Full Trust:

Full Trust

Después dar clic en Next y luego en Finish.

Reinicia VWD y vuelve a compilar tu aplicación. Todo debe funcionar bien ahora. Si no funciona con Build intenta con Rebuild.

Nota importante:

He notado que en algunos casos para eliminar este error además de Local Intranet hay que seleccionar Internet y establecer el selector en Full Trust.