2009-03-30 20 views
73

Sto tentando di aggiungere un riferimento di script a jQuery nella mia pagina principale in modo che funzioni per qualsiasi pagina. E 'attualmente appare cosìProblemi di pagina principale e file ASP.Net

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

Il problema è che il percorso è sempre relativo alla pagina aspx esecuzione così questo funziona solo se il file "jquery.js" si trova nella stessa cartella. Per farlo funzionare devo cambiare la linea:

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

Questo è ovviamente meno che ideale, perché funziona solo per le pagine che sono due livelli di profondità dalla cartella principale. Se provo quanto segue, IIS genera un errore su un personaggio inaspettato.

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

Qualche idea?

EDIT: ho dimenticato di dire anche che lo script deve essere nel tag head

La risposta attuale top getta una "ASP.NET Ajax framework lato client non è riuscito a caricare" Errore quando lo aggiungo alla mia pagina principale. È generato da javascript e non dal compilatore .Net. Se sposto lo ScriptManager nella sezione head dove dovrebbe essere, viene visualizzato un errore di compilazione relativo allo ScriptManager che deve trovarsi all'interno di un tag form.

La terza risposta getta un "caratteri illegali nel percorso." Eccezione del compilatore

EDIT 2: Quando aggiungo quella linea al mio tag head ottengo questo errore da IIS.

La collezione I controlli non possono essere modificati perché il controllo contiene blocchi di codice (cioè <% ...%>)

risolto: ho preso la risposta modificata dalla risposta qui sotto e metterlo all'interno di un asp: ContentPlaceHolder elemento

risposta

106

È possibile utilizzare un ScriptManager:

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

EDIT: Se assolutamente bisogno di questo nella vostra sezione <head>, si potrebbe fare qualcosa di simile:

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

EDIT 2: Secondo i commenti, se si sta osservando che

La raccolta Controls non può essere modificata perché il controllo contiene blocchi di codice (ad es. <% ...%>)

potrebbe essere necessario cambiare la precedenza per utilizzare il data-binding sintassi:

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

Sì, questo è un metodo altamente raccomandato in molti libri ASP.NET che ho scritto quando si tratta di percorsi in pagine master. – Kezzer

+0

FYI, il mio collega e io ci siamo appena provati. Ciò non sembra funzionare in uno scenario della pagina principale nidificato * nella pagina principale padre *. Passare alla pagina principale del bambino, tuttavia, ha fatto il trucco. – technomalogical

+2

Questo ha funzionato per me su quasi tutte le mie pagine, ma per 2 pagine che sarebbero esplose con una certa eccezione: "La collezione di controlli non può essere modificata perché il controllo contiene codice". La soluzione consiste nel modificare l'inclusione dello script nell'intestazione da un codeblock response.write a un valutatore del database (ad esempio, modificare <% = a <% #). Potrei azzardare un'ipotesi che si tratti di un qualche tipo di tentativo da parte di MS di bloccare gli attacchi dell'header http. Una spiegazione migliore di questa facile soluzione è disponibile su: http://leedumond.com/blog/the-controls-collection-cannot-be-modified-because-the-control-taintain-code-blocks/ – Jagd

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

problema con percorsi fuori la radice è che a volte si può dev in una directory virtuale e quindi distribuire alla radice di un sito, o vice versa. – StuartLC

0

Se questo tag script va direttamente al browser, quindi è improbabile possibile sostituire radice del tuo sito c'è . Almeno non sul server. Quindi è possibile:

  1. sito Distribuire alla radice del dominio nome e utilizzare percorsi assoluti (soluzione più semplice).
  2. Inserire questo collegamento con controllo server.
  3. Preelaborare il codice HTML risultante prima dello inviandolo al client (con HttpResponse.Filter).
9

Se non avete intenzione di noi asp: ScriptManager o percorsi assoluti allora si può fare in questo modo:

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

È anche possibile utilizzare < di base> tag HTML:

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

e quindi tutti i collegamenti nella sezione di intestazione sono relative all'indirizzo di base:

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

È spesso utile quando si dispone di più destinazioni di pubblicazione, ad esempio server Web di sviluppo locale, server di dimostrazione, ecc. È sufficiente sostituire l'URL di base.

+0

Come cambiare ' base href' programmaticamente? –

3

Non so se voi ragazzi avete trovato o meno la soluzione al vostro problema. Stavo affrontando lo stesso problema e impazzivo per capire perché ottengo l'errore "jQuery è indefinito" sui plugin che uso. Ho provato tutte le soluzioni che ottengo da internet ma senza fortuna.

Ma, all'improvviso mi viene in mente qualcosa che potrebbe essere che i file di script dovrebbero essere in ordine. Così, ho spostato il jquery referece in prima posizione e tutto ha iniziato a funzionare come un incantesimo.

Ricorda, ragazzi, se stai utilizzando qualsiasi plugin con jquery, assicurati di utilizzare l'ordine di impostazione del riferimento a quei campi.

  1. riferimento alla libreria jquery
  2. riferimento alle altre successive plug-in librerie e così via ...

ad esempio:

  1. "script src =" 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 "type =" text/javascript "...
  4. " script src = "js/jquery.bgiframe.min.js" type = "text/javascript "...

Assicurarsi sempre di inserire prima il riferimento jquery e quindi le librerie successive.

Spero che questo risolva il tuo problema soprattutto quando utilizzi MasterPages. È molto strano che funzioni indipendentemente dall'ordine che si usa quando non si usano MasterPages, ma quando lo si fa, in qualche modo richiede l'ordine corretto.

Buona fortuna e codifica felice,

Vincent D'Souza

3

Guarda How to Run a Root “/”. Questo dovrebbe risolvere tutti i tuoi problemi relativi ai percorsi file irrisolti .js. Fondamentalmente riconfigurate il server VS Dev per eseguire l'applicazione come localhost:port/ in contrasto con il normale localhost:port/application name/ facendo in modo che la risoluzione dei nomi funzioni allo stesso modo che su IIS.

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

Prova <%# invece di <%= nella pagina master nella sezione testa

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

Poi, nel codice sottostante pagina Maestro sotto Page_Load Evento

Page.Header.DataBind(); 

Ora vi sono buone per andare con entrambi i jQuery e JavaScript, così come CSS, devi solo cambiare il tuo percorso in ResolveUrl quale file vuoi gestire CSS, JavaScript, jQue ry.

+1

La riga 'Page.Header.DataBind();' ha funzionato correttamente, grazie! –

+0

Potrebbe anche essere necessario aggiungere l'attributo 'runat =" server "' sul tag 'head'. – Alex

0

Per percorso assoluto del file per qualsiasi pagina di utilizzo seguendo:

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