2010-12-30 8 views

Respuesta

18

Se pone de aquí:

VirtualPathUtility.ToAbsolute(contentPath, httpContext.Request.ApplicationPath); 

Aquí está la salida reflector para PathHelpers clase en System.Web.Mvc DLL:

private static string GenerateClientUrlInternal(HttpContextBase httpContext, string contentPath) 
{ 
    if (string.IsNullOrEmpty(contentPath)) 
    { 
     return contentPath; 
    } 
    if (contentPath[0] == '~') 
    { 
     string virtualPath = VirtualPathUtility.ToAbsolute(contentPath, httpContext.Request.ApplicationPath); 
     string str2 = httpContext.Response.ApplyAppPathModifier(virtualPath); 
     return GenerateClientUrlInternal(httpContext, str2); 
    } 
    NameValueCollection serverVariables = httpContext.Request.ServerVariables; 
    if ((serverVariables == null) || (serverVariables["HTTP_X_ORIGINAL_URL"] == null)) 
    { 
     return contentPath; 
    } 
    string relativePath = MakeRelative(httpContext.Request.Path, contentPath); 
    return MakeAbsolute(httpContext.Request.RawUrl, relativePath); 
} 
+0

mi pregunta se basa en este problema "http://stackoverflow.com/questions/4563043/root-path-with-tilde-does-not-change-upper-case-to-lower-case" para ver el enlace " http://msdn.microsoft.com/en-us/library/system.web.virtualpathutility.aspx ", creo que el problema no está en asp.net-mvc, sino en IIS. Gracias –

1

ASP.Net traduce la tilde (~) con el directorio raíz de la aplicación en cada control runat = server. Es el equivalente para la propiedad HttpRuntime.AppDomainAppVirtualPath.

+0

No, no es equivalente. AppDomainAppVirtualPath es "La ruta virtual del directorio que contiene la aplicación alojada en el dominio de la aplicación actual" (directorio virtual). Ciertamente no es lo mismo con el directorio raíz de la aplicación, al menos desde IIS7. –

2

Ver MSDN:Web Project Paths

ASP.NET incluye el operador de aplicaciones Web raíz (~), que se puede utilizar al especificar una ruta en el servidor controles. ASP.NET resuelve el operador ~ a la raíz de la aplicación actual . Puede usar el operador ~ junto con las carpetas para especificar una ruta que se basa en la raíz actual .

Básicamente, el objetivo de la tilde es que pueda tener una ruta que se resuelva correctamente incluso si implementa su sitio web en diferentes lugares. Las rutas relativas no pueden lograr esto fácilmente porque los controles se pueden representar en diferentes carpetas dentro de su sitio web. Las rutas absolutas no pueden lograr esto porque su sitio web puede implementarse en diferentes ubicaciones, si no en otro caso, este es el caso de las implementaciones de prueba realizadas localmente frente a las implementaciones de lanzamiento en el servidor activo.

Server.MapPath se puede utilizar por razones similares.

Cuestiones relacionadas