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.
///
/// Obtinene el nombre de la pagina y su carpeta
///
/// Devuelve el nombre de la página
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.
///
/// Obtinene el nombre de la pagina del archivo en ejecucion
///
/// Devuelve el nombre de la pagina
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