2010-03-16 25 views
5

Tengo una página maestra ASP.net. En este máster, tengo todos mis archivos css y javascript definidos. También tengo algunas imágenes y algunos botones e hipervínculos.Base URL en ASP.net Páginas maestras con directorios virtuales

todas las URLs están declarados como relativa, es decir "/scripts/ian.js"

Todo funciona bien si este sitio es el sitio web de la raíz, pero necesito que funcione en un directorio virtual.

Mi problema es que cuando coloco este sitio web en un directorio virtual debajo de un sitio raíz, todos mis enlaces apuntan al sitio raíz. así que mis enlaces apuntan a www.root.com/scripts/ian.js pero debería estar apuntando a www.root.com/virtualDir/scripts/ian.js

Pensé que la etiqueta Base Href en el encabezado ayudaría, pero hasta ahora no parece estar ayudando de todos modos. Todos los enlaces siguen apuntando al sitio web raíz cuando sobrevivo sobre ellos.

Lo que me gustaría es una configuración única en IIS o el archivo de configuración que pueda establecer una url raíz y cualquier imagen, secuencia de comandos o enlace en la página maestra o página de contenido señalaría el lugar correcto.

Cualquier sugerencia o idea es bienvenida.

Gracias

Respuesta

6

todas las URLs están declarados como relativa es decir, "/scripts/ian.js"

Esos parecen ser el URL de absoluta que está utilizando, en lugar de la URL de un pariente, que es probablemente la razón por la etiqueta <base /> es no tener el efecto deseado:

Este atributo especifica un absoluto URI que actúa como el URI base para que resuelve los URI relativos.

- desde http://www.w3.org/TR/html401/struct/links.html#h-12.4

usted podría intentar eliminar el encabezado '/' de su URL para ver si funciona?

En su defecto, que tienden a utilizar ResolveClientUrl de moverse por temas como este, que tendrá que utilizar en la misma forma que otros han sugerido el uso de ResolveUrl:

<script type="text/javascript" src="<%= ResolveClientUrl("~/path/to/js") %>"></script> 
... 
<img src="<%= ResolveClientUrl("~/path/to/img") %>" alt="..." /> 

Espero que esto ayude.

0

uso de tilde (~) en referencia yout (es decir ~/Scrips/ian.js) ... ver si funciona Para los enlaces tratan Page.ResolveUrl en la página .aspx.

+0

No, tilde no funciona para scripts. Obtendrá un error cuando el servidor intente ejecutar el script. –

2

mayoría de las etiquetas, incluyendo etiquetas HTML regulares como <enlace>, <img>, etc se puede utilizar el ~/ como la ruta raíz de la aplicación si se establece el * 'runat = "server"' atributo.

por ejemplo.

<img src="~/images/test.png" runat="server" /> 

Esto hace etiqueta de una etiqueta de servidor y la tilde se reemplaza con la raíz de la aplicación antes de la salida se devuelve al navegador.

Esto no funciona como se esperaba para el script < > embargo. Cuando 'runat = "server' se establece para la etiqueta script, el script se considera que es del lado del servidor JavaScript y ejecución de tentativa.

Para evitar esto, puede o bien inyectar el javascript usando one of the register client script métodos. tu puedes usar el <% = ResolveUrl ('~')% > etiqueta en su etiqueta de script.

+0

¿No hay una configuración global que pueda establecer, así que no tengo que ir y actualizar todos los enlaces, imágenes, secuencias de comandos, etc.? PD. Thx – SetiSeeker

+0

No es que yo sepa. Intento usar siempre "~" rutas relativas o rutas relativas de carpeta, por ejemplo. "../alguna cosa". Esto permite mover la aplicación en el futuro. Una buena búsqueda/reemplazo de expresiones regulares debería ser capaz de captar la mayoría, si no todos, sus enlaces ofensivos. – kervin

+0

Si bien puede usar "~" con runat = server para las referencias de archivos CSS, lo más probable es que esto ocurra con los archivos JavaScript, ya que forzará el código de ejecución de JavaScript en el lado del servidor. –

2

Este método estático que devuelve ruta http completa de la carpeta raíz de la aplicación (sitio web o directorio virtual)

public static string GetAppRootUrl(bool endSlash) 
{ 
    string host = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); 

    string appRootUrl = HttpContext.Current.Request.ApplicationPath; 
    if (!appRootUrl.EndsWith("/")) //a virtual 
    { 
     appRootUrl += "/"; 
    } 
    if (!endSlash) 
    { 
     appRootUrl = appRootUrl.Substring(0, appRootUrl.Length - 1); 
    } 
    return host + appRootUrl; 
} 

Por lo tanto, se puede escribir en la página maestra:

<script src="<%= Server.HtmlEncode(GetAppRootUrl(false)) %>/scripts/ian.js" language="javascript" type="text/javascript"></script> 
0

Por lo tanto, encontrado este IIS rareza anoche:

<script src="/js/file.js"></script> 

no funcionará correctamente en una aplicación virtual que está en un subdirectorio del sitio principal de IIS.

su lugar, debe hacerlo de esta manera:

<script src="/js/file.js" type="text/javascript"></script> 

¿Cuál es la forma estándar de hacerlo, pero si usted no está buscando para ello, se le puede sorprender que esa etiqueta adicional hace que el pariente los problemas de ruta desaparecen

Cuestiones relacionadas