Problemas con la ruta de archivo y la página maestra de ASP.Net


78

Estoy tratando de agregar una referencia de script a jQuery en mi página maestra para que funcione para cualquier página. Actualmente se ve así

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

El problema es que la ruta siempre es relativa a la página aspx en ejecución, por lo que esto solo 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 no es ideal porque solo funcionará para páginas que estén a dos niveles de profundidad desde la carpeta raíz. Si intento lo siguiente, IIS arroja un error sobre un personaje inesperado.

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

¿Algunas ideas?

EDITAR: Olvidé mencionar también que el guión DEBE estar en la etiqueta principal

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

La tercera respuesta arroja una excepción " Caracteres ilegales en la ruta " del compilador.

EDITAR 2: Cuando agrego esa línea a mi etiqueta principal, obtengo este error de IIS.

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

RESUELTO: Tomé la respuesta editada de la respuesta a continuación y la puse dentro de un elemento asp: ContentPlaceHolder


Respuestas:


110

Podrías usar un ScriptManager:

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

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

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

EDITAR 2: Según los comentarios, si estás observando que

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

es posible que deba cambiar lo anterior para usar la sintaxis de enlace de datos:

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

Sí, este es un método muy recomendado en muchos libros ASP.NET que he escrito al tratar con rutas en páginas maestras.
Kezzer

FYI, mi compañero de trabajo y yo acabamos de probar esto. Esto no parece funcionar en un escenario de página maestra anidada en la página maestra principal . Sin embargo, moverlo a la página maestra secundaria funcionó.
technomalogical

3
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 script incluido en el encabezado de un bloque de código response.write a un evaluador de enlace de datos (es decir, cambiar <% = a <% #). Me arriesgaría a adivinar que es algún tipo de intento por parte de MS para detener los ataques de encabezado http. Puede encontrar una mejor explicación de esta solución sencilla en: leedumond.com/blog/…
Jagd

Usando base href?
PreguntonCojoneroCabrón


25

Pruebe en <%#lugar de <%=en la página maestra debajo de la sección del encabezado

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

Luego, en Código subyacente de la página maestra en Page_LoadEvento

Page.Header.DataBind();

Ahora está listo para usar jQuery y JavaScript, así como CSS, solo necesita cambiar su ruta en ResolveUrlqué archivo desea manejar CSS, JavaScript, jQuery.


1
Necesitaba la Page.Header.DataBind();línea para que me funcionara, ¡gracias!
Brendan Hannemann

Es posible que también deba agregar el runat="server"atributo en la headetiqueta.
Alex

11

Si no va a nosotros asp: ScriptManager o rutas absolutas, puede hacerlo así:

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

3

No sé si ustedes encontraron la solución a su problema o no. Estaba enfrentando el mismo problema y volviéndome loco al descubrir por qué obtengo el error "jQuery is undefined" en los complementos que uso. Probé todas las soluciones que obtengo de Internet, pero no tuve suerte.

Pero, de repente, algo me vino a la mente: los archivos del script deberían estar en orden. Entonces, moví la referencia de jquery a la primera posición y todo comenzó a funcionar a la perfección.

Recuerden chicos, si están usando complementos con jquery, asegúrese de usar el siguiente orden de referencia de configuración a esos campos.

  1. referencia a la biblioteca jquery
  2. referencia a las otras bibliotecas de complementos posteriores y así sucesivamente ...

p.ej:

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

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

Espero que esto resuelva su problema, especialmente cuando lo usa con MasterPages. Es muy extraño que funcione sin importar el orden que use cuando no usa MasterPages, pero cuando lo hace, de alguna manera requiere el orden correcto.

Buena suerte y feliz codificación,

Vincent D'Souza


3

Mire Cómo ejecutar una raíz “/” . Esto debería solucionar todos sus problemas relacionados con las .jsrutas de archivo sin resolver . Básicamente, reconfigura el servidor VS Dev para ejecutar su aplicación en localhost:port/lugar de la localhost:port/application name/resolución de nombres habitual para que funcione de la misma manera que en IIS.


1

Para la ruta absoluta del archivo para cualquier página, utilícela a continuación:

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

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

2
El problema con las rutas fuera de la raíz es que a veces puede desarrollar un directorio virtual y luego implementarlo en la raíz de un sitio, o viceversa.
StuartLC

0

Si esta etiqueta de secuencia de comandos va directamente al navegador, es poco probable que pueda sustituir la raíz de su sitio allí. Al menos no en el servidor. Así que puedes:

  1. Implemente el sitio en la raíz del nombre de dominio y use rutas absolutas (solución más simple).
  2. Inserte este enlace con el control del servidor.
  3. Procese previamente el HTML resultante antes de enviarlo al cliente (con HttpResponse.Filter).

0

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

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

y luego todos los enlaces en la sección de encabezado son relativos a la dirección base:

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

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


¿Cómo cambiar base hrefprogramáticamente?
PreguntonCojoneroCabrón

0
<body>
<script language="javascript" src='<%= this.ResolveClientUrl("~/full/path/to/jquery.js") %>' type="text/javascript"></script>
</body>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.