Agosto 30

2018

Nombre de página o más bien de archivo

En varias ocasiones he necesitado conocer el nombre de la página desde donde se está ejecutando alguna función para cambiar objetos según que página es.

Por ejemplo, si trabajas en WebForms con MasterPage, es muy posible, como me ha pasado a mí, necesitar cambiar el logo de la empresa en función de la página ya que una tiene el fondo oscuro y otra el fondo claro, para conseguir el contraste perfecto.

Para solucionar esto tenemos varias técnicas, pero me encontré con un problema al utilizar Rutas, pero vamos a ver cual es la opción más fácil y con la que más veces te encuentras cuando consultas por Internet.

Request.Url

Si accedemos a este objeto podemos invocar a 

Request.Url.AbsoluPath

 Con esto luego podríamos hacer un InSrt() comprobando el nombre de la página y listo.

Otra opción es intentar recoger sólo el nombre de la página con

  Request.Url.Segments[Request.Url.Segments.Length -1]

 Así estamos seleccionando sólo el nombre, sin la extensión, ya que eso no lo necesitamos.

Yo, hasta hace unos días, siempre utilizaba esta función que hice hace mucho tiempo.

/// <summary>
/// Obtinene el nombre de la pagina y su carpeta
/// </summary>
/// <returns>Devuelve el nombre de la página</returns>
Public static string getPageName(bool onlyName = false)
{
//conocer el nombre de la página en la que estoy, y su carpeta
string arrResult = HttpContext.Current.Request.Url.AbsolutePath;
if (onlyName == true) arrResult = HttpContext.Current.Request.Url.Segments[HttpContext.Current.Request.Url.Segments.Length - 1];
return arrResult;
}

Comienzan los peros

El problema comienza si utilizas Rutas con System.Web.Routing.RouteTable.Routes.MapPageRoute que si recogemos el valor de Request.Url.AbsolutPath nos devuelve exactamente la url que vemos en el navegador. Y es posible que no tenga nada que ver con el nombre de la página real o que se está ejecutando. Un ejemplo podría ser

http://www.miweb.com/relojes/caros

Esta frienly url o para nosotros, esta ruta, podría estar ejecutando realmente un archivo alojado en

http://www.miweb.com/gestion/productos.aspx?familia=relojes&tipo=caros

Siguiendo un poco con el ejemplo anterior de las master pages, necesitamos cambiar la imagen del logotipo y si ejecuto la función propuesta no voy a obtener nada relacionado con PRODUCTOS que es la página en la que necesito cambiar la imagen, texto, o consulta.

La solución propuesta

Al encontrarme con este problema me lancé de nuevo a ampliar mis conocimientos y a leer información en Internet, además de comparar diferentes propuestas, casi todas con la primera solución que os he mostrado.

La solución está en el objeto System.Web.UI.Page. Este objeto es el que realmente conoce el nombre del archivo desde el que se está ejecutando el código fuente. Luego nos vamos a apoyar en otro objeto, System.IO.Path.

Primero necesitamos recuperar la ruta de la página con la propiedad AppRelativeVirtualPath. Una vez tenemos la ruta de la página, recuperamos el nombre físico del archivo con Server.MapPath(ruta de la página), y finalmente recuperamos el nombre del archivo con System.IO.Path.GetFileName(ruta física del archivo). Aquí os dejo la función completa. Se que se puede simplificar mucho, pero lo he hecho así para que se vea con más claridad todos los pasos.

/// <summary>
/// Obtinene el nombre de la pagina del archivo en ejecucion
/// </summary>
/// <returns>Devuelve el nombre de la pagina</returns>
public static string getPageFileName(System.Web.UI.Page page)
{
string pagina = HttpContext.Current.Server.MapPath(page.AppRelativeVirtualPath);
string filename = System.IO.Path.GetFileName(pagina);
return filename;
}

Una cosa a tener en cuenta es que se recupera el nombre del archivo con la extensión.


Happy codding


#CSHARP #ASP


0 Comentarios



Archivo