Una función que se usa con frecuencia, pero nunca encontré una solución relevante en Internet. Hoy, aproveché la oportunidad de la aplicación del proyecto para escribir dos métodos para convertir rutas absolutas en rutas virtuales y encapsularlas. ruta relativa a la página especificada
/**//// <resumen>
/// Convierte la ruta absoluta del sitio web en una ruta virtual relativa a la página especificada
/// </summary>
/// <param name="page">Puntero de página actual, normalmente este</param>
/// <param name="specifiedPath">Ruta absoluta</param>
/// <returns>Ruta virtual, tipo: ../../</returns>
cadena estática pública ConvertSpecifiedPathToRelativePathForPage (página de página, cadena especificadaPath)
{
//Ruta virtual del directorio raíz
cadena virtualPath = página.Request.ApplicationPath;
//Ruta absoluta al directorio raíz
ruta de cadenaRooted = HostingEnvironment.MapPath(rutavirtual);
//Ruta virtual de la página
cadena pageVirtualPath = page.Request.Path;
if (!Path.IsPathRooted(specifiedPath) || specifiedPath.IndexOf(pathRooted) == -1)
{
throw new Exception(string.Format(""{0}"¡es una ruta virtual, no una ruta absoluta!", SpecificPath));
}
// Convertir a ruta relativa
//(La prueba encontró que pathRooted parece ser diferente cuando se ejecuta en el servidor que viene con VS2005 y en el directorio raíz o directorio virtual en IIS.
// Algunos lugares agregarán "" después, otros no, solo tome una decisión para estar seguro)
if (rutaRooted.Substring(rutaRooted.Longitud - 1, 1) == "\")
{
ruta especificada = ruta especificada.Replace(rutaRooted, "/");
}
demás
{
ruta especificada = ruta especificada.Replace(rutaRooted, "");
}
cadena relativaPath = specPath.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/');
// Resta la última página y el valor "" anterior;
int pageNodesCount = pageNodes.Length - 2
para (int i = 0; i < pageNodesCount; i++)
{
rutarelativa = "/.." + rutarelativa;
}
si (pageNodesCount > 0)
{
// Si ".." existe, elimina el "/" inicial
rutarelativa = rutarelativa.Substring(1, rutarelativa.Longitud - 1);
}
devolver ruta relativa;
}
El segundo método obviamente se extrae de la primera parte del primer método, por lo que soy demasiado vago para agregar comentarios relevantes: P
Convierta la ruta absoluta debajo del sitio web en una ruta virtual
/**//// <resumen>
/// Convierte la ruta absoluta del sitio web en una ruta virtual
/// Nota: Aquellos que se encuentren en sitios que no sean web no se convertirán.
/// </summary>
/// <param name="page">Puntero de página actual, normalmente este</param>
/// <param name="specifiedPath">Ruta absoluta</param>
/// <returns>Ruta virtual, tipo: ~/</returns>
cadena estática pública ConvertSpecifiedPathToRelativePath (página de página, cadena especificadaPath)
{
cadena virtualPath = page.Request.ApplicationPath;
cadena rutaRooted = HostingEnvironment.MapPath(virtualPath);
if (!Path.IsPathRooted(specifiedPath) || specifiedPath.IndexOf(pathRooted) == -1)
{
devolver ruta especificada;
}
if (rutaRooted.Substring(rutaRooted.Longitud - 1, 1) == "\")
{
ruta especificada = ruta especificada.Replace(rutaRooted, "~/");
}
demás
{
ruta especificada = ruta especificada.Replace(rutaRooted, "~");
}
cadena ruta relativa = ruta especificada.Replace("\", "/");
devolver ruta relativa;
}
No hay nada que decir acerca de convertir una ruta virtual en una ruta absoluta. El método HttpRequest.MapPath está diseñado específicamente para hacer esto.