2009-03-30 26 views
73

Estoy tratando de agregar una referencia de script a jQuery en mi página maestra para que funcione para cualquier página. En la actualidad se ve asíASP.Net Página maestra y problemas de ruta de archivos

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

El problema es que el camino es siempre relativa a la página aspx la ejecución de lo que esto sólo funcionará si el archivo "jquery.js" se encuentra en la misma carpeta. Para que funcione tengo que cambiar la línea a:

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

Obviamente, esto es menos que ideal, ya que sólo funciona para las páginas que son dos niveles de profundidad desde la carpeta raíz. Si intento lo siguiente, IIS arroja un error sobre un carácter inesperado.

<script runat="server" type="text/javascript" src="~/jquery.js"></script> 

¿Alguna idea?

EDIT: me olvidó mencionar también que el script debe estar en la etiqueta de la cabeza

La respuesta superior actual arroja una "marco del lado del cliente ASP.NET Ajax no pudo cargar" error cuando lo agrego a mi página maestra Está lanzado desde JavaScript y no desde el compilador .Net. Si muevo el ScriptManager a la sección principal donde debería estar, obtengo un error de compilación sobre el scriptManager que necesita estar dentro de una etiqueta de formulario.

La tercera respuesta lanza un "caracteres ilegales en ruta." Excepción del compilador

EDIT 2: Cuando agrego que la línea a mi etiqueta de la cabeza me sale este error de IIS.

La colección Los controles no pueden ser modificados debido a que el control contiene bloques de código (es decir <% ...%>)

resuelto: Tomé la respuesta editada de la respuesta de abajo y lo puso dentro de una asp: ContentPlaceHolder elemento

Respuesta

106

Se puede usar un ScriptManager:

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
    <Scripts> 
     <asp:ScriptReference Path="~/jquery.js" /> 
    </Scripts> 
</asp:ScriptManager> 

EDIT: Si absolutamente necesita esto en su sección <head>, que podría hacer algo como:

<head> 
    <script type="text/javascript" 
     src="<%= Page.ResolveClientUrl("~/jquery.js") %>"></script> 
</head> 

EDIT 2: De acuerdo con los comentarios, si está observando que

La colección Controls no se puede modificar porque el control contiene bloques de código (es decir, <% ...%>)

puede que tenga que cambiar el anterior para utilizar la sintaxis de enlace de datos:

<head> 
    <script type="text/javascript" 
     src="<%# Page.ResolveClientUrl("~/jquery.js") %>"></script> 
</head> 
+0

Sí, este es un método muy recomendable en muchos libros de ASP.NET que he escrito cuando trato con rutas en las páginas maestras. – Kezzer

+0

FYI, mi compañero de trabajo y yo probamos esto. Esto no parece funcionar en una situación de página maestra anidada * en la página maestra principal *. Sin embargo, moverlo a la página maestra de niños hizo el truco. – technomalogical

+2

Esto funcionó para mí en casi todas mis páginas, pero para 2 páginas que explotarían con una cierta excepción: "La colección de controles no se puede modificar porque el control contiene código". La solución es cambiar el guión incluir en el encabezado de un bloque de código response.write a un evaluador de enlace de datos (es decir, cambiar <% = to <% #). Me atrevería a adivinar que es un tipo de intento por parte de MS para detener los ataques de encabezado http. Se puede encontrar una mejor explicación de esta solución fácil en: http://leedumond.com/blog/the-controls-collection-cannot-be-modified-because-the-control-contains-code-blocks/ – Jagd

0
<script type="text/javascript" src="/full/path/to/jquery.js"></script> 
+2

Problema con las rutas de la raíz es que a veces es posible que dev en un directorio virtual y luego desplegar en la raíz de un sitio, o viceversa. – StuartLC

0

Si esta etiqueta script va directamente al navegador, entonces usted probablemente puede sustituir la raíz de su sitio Web puede haber . Al menos no en el servidor. Para que pueda:

  1. sitio Implementar en la raíz del nombre de dominio y utilizar rutas absolutas (solución más simple).
  2. Inserta este enlace con el control del servidor.
  3. Preprocesa HTML resultante antes de enviándolo al cliente (con HttpResponse.Filter).
9

Si no nos vas a asp: ScriptManager o rutas absolutas a continuación, puede hacerlo de esta manera:

<script runat="server" type="text/javascript" 
    src='<%= Page.ResolveUrl("~/jquery.js") %>'></script> 
0

También puede utilizar la base <> etiqueta HTML:

<base href="http://www.domain.com"></base> 

y luego todos los eslabones de sección de encabezado son en relación con la dirección base:

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

A menudo es útil cuando tiene varios destinos de publicación, como servidor web local de desarrollo, servidor de demostración, etc. Simplemente reemplace esa URL base.

+0

Cómo cambiar ' base href' programmatically? –

3

No sé si ustedes encontraron la solución a su problema o no. Me enfrentaba al mismo problema y me volví loco al descubrir por qué obtengo el error "jQuery no está definido" en los complementos que uso. Probé todas las soluciones que recibí de internet, pero no hubo suerte en absoluto.

Pero, de repente, me viene a la mente que los archivos del script deberían estar en orden. Entonces, moví el referendo de jquery al primer puesto y todo comenzó a funcionar como encanto.

Recuerde chicos, si está utilizando complementos con jquery, asegúrese de utilizar el siguiente orden de configuración de referencia de esos campos.

  1. referencia a la biblioteca jquery
  2. referencia a los otros plug-in bibliotecas y así sucesivamente ...

por ejemplo subsiguientes:

  1. "src = script" js/jquery-1.3.2.min.js "type =" text/javascript "...
  2. " script src = "js/jqDnR.min.js" type = "text/javascript" ...
  3. "script src =" js/jquery.jqpopup.min.js "tipo =" texto/javascript "...
  4. " script src = "js/jquery.bgiframe.min.js" type = "text/javascript "...

Siempre asegúrese de que debe poner la referencia jquery primero y luego las bibliotecas posteriores.

Espero, esto resuelve su problema especialmente cuando se utiliza con MasterPages. Es muy extraño que funcione sin importar el orden que uses cuando no uses MasterPages, pero cuando lo haces, entonces de alguna manera requiere el orden correcto.

Suerte y codificación feliz,

Vincent D'Souza

3

Mira How to Run a Root “/”. Esto debería solucionar todos los problemas relacionados con las rutas de archivos .js sin resolver. Básicamente, reconfigure el servidor de VS Dev para ejecutar su aplicación como localhost:port/ en oposición a la localhost:port/application name/ normal que hace que la resolución del nombre funcione de la misma manera que en IIS.

0
<body> 
<script language="javascript" src='<%= this.ResolveClientUrl("~/full/path/to/jquery.js") %>' type="text/javascript"></script> 
</body> 
25

Trate <%# en lugar de <%= en la página principal en la sección de cabeza

<script type="text/javascript" 
     src="<%# ResolveUrl("~/YourScriptFolder/YourJQueryOrJavascript.js") %>"> 
</script> 

Luego, en código subyacente de la página principal bajo Page_Load Evento

Page.Header.DataBind(); 

Ahora ya está bueno para ir con cualquiera jQuery y JavaScript, así como CSS, solo necesita cambiar su ruta en ResolveUrl, que archivo desea manejar con CSS, JavaScript, jQue ry.

+1

Necesitaba la línea 'Page.Header.DataBind();' para que funcione, ¡gracias! –

+0

También puede necesitar agregar el atributo 'runat =" server "' en la etiqueta 'head'. – Alex

0

Por ruta absoluta del archivo de página, el uso que siguiente:

<script type="text/javascript" src="<%= Page.ResolveClientUrl("~/jquery.js") %>"></script> 
Cuestiones relacionadas