Home > General > Transformar URLs virtuales en absolutos con ASP.NET

Transformar URLs virtuales en absolutos con ASP.NET

mayo 27, 2009

Una de las ventajas que tiene ASP.NET sobre otras plataformas de desarrollo es que las aplicaciones son auto-contenidas en proyectos y al administrador del servidor se le facilita instalarlas en diferentes áreas de un sitio web.

Claro, esto solo funciona si la aplicación fue desarrollada teniendo en cuenta que puede quedar instalada en diferentes carpetas, porque si el desarrollador dejó URLs fijos en algún lado esa parte de la aplicación se va a dañar si no se instala en la misma carpeta.

Por ejemplo, si el logo de la aplicación está en "/Images/logo.png" y el desarrollador puso el URL fijo desde la raíz, cuando la aplicación se instale en otra carpeta el logo no va a aparecer.

¿Cómo evitamos este problema? Fácil: utilizando URLs virtuales que ASP.NET luego transforma en absolutos dependiendo de la carpeta donde se haya instalado la aplicación. Por ejemplo, si especificamos el logo de esta forma:

<asp:Image ID="iLogo" runat="server" ImageUrl="~/Images/Logo.png" />

ASP.NET lo convertirá automáticamente en una etiqueta <IMG> con el URL apropiado dependiendo de la carpeta donde se haya instalado la aplicación.

Los controles que necesitan URLs hacen esta conversión por nosotros cuando es apropiado. Pero ¿Cómo utilizar URLs virtuales cuando no estamos usando controles? Por ejemplo, en una etiqueta <LINK> o <SCRIPT>.

En el fichero .ASPX o en el code-behind podemos usar el método ResolveClientUrl() que realiza la misma función. Por ejemplo, en una etiqueta <SCRIPT> podemos hacer esto:

<script src="<%= ResolveClientUrl("~/Scripts/effects.js") %>" type="text/javascript">
</script>

Este método está definido en la clase Control y tanto Page como UserControl hereda en algún punto de Control.

Ahora, ¿Como transformar un URL virtual en una clase que no hereda de Control? Por ejemplo en una clase Presenter que debe transformar URLs virtuales almacenados en la base de datos.

En estos casos podemos utilizar los métodos estáticos de la clase VirtualPathUtility. Por ejemplo, suponga que tengo una lista con los URLs de documentos adjuntos que quiero pasar a la vista transformados en URLs absolutos. Lo puedo hacer de esta forma:

// En el Presenter
public string Attachments
{
    get
    {
        foreach (var url in m_attachments)
            yield return VirtualPathUtility.ToAbsolute(url);
    }
}

Utilizando URLs virtuales podemos asegurarnos que nuestra aplicación va a funcionar de la misma forma ya sea que la instalen en la raíz del sitio web como si la instalan en otra carpeta y como vieron ASP.NET nos facilita bastante el trabajo con los diferentes métodos para transformarlos.

Categories: General Tags: ,