2009-03-30 21 views
73

Próbuję dodać referencję do skryptu do jQuery na mojej stronie wzorcowej, aby działała dla dowolnej strony. Obecnie wygląda toProblemy ze stroną ASP.Net i ścieżką pliku

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

Problem polega na tym, że droga jest zawsze w stosunku do wykonującego strony aspx tak to będzie działać tylko wtedy, gdy „jquery.js” plik znajduje się w tym samym folderze. Aby to działało muszę zmienić linię do:

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

To jest oczywiście mniej niż ideał, bo to będzie działać tylko na stronach, które są głęboko dwa poziomy z folderu głównego. Jeśli spróbuję następujących rzeczy, usługi IIS zgłaszają błąd dotyczący nieoczekiwanego znaku.

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

Wszelkie pomysły?

EDIT: Zapomniałem wspomnieć także, że skrypt musi być w tagu głowy

Aktualnym top odpowiedź rzuca „ASP.NET Ajax ram po stronie klienta nie udało się załadować” błąd kiedy dodaję go do mojej strony wzorcowej. Jest wyrzucany z javascript, a nie z kompilatora .Net. Jeśli przeniesię skrypt ScriptManager do sekcji head, gdzie powinien być, otrzymam błąd kompilacji związany z tym, że ScriptManager musi znajdować się wewnątrz znacznika formularza.

Trzecia odpowiedź rzuca „znaki nielegalne w ścieżce.” Wyjątek od kompilatora

EDIT 2: Kiedy dodać tę linię do mojego tagu głowy mam ten błąd z IIS.

kolekcji Controls nie mogą być modyfikowane, ponieważ kontrola zawiera bloki kodu (tj <% ...%>)

rozwiązany: Wziąłem edytowany odpowiedź z odpowiedzią poniżej i umieścić go wewnątrz asp: ContentPlaceHolder elementem

Odpowiedz

106

można użyć ScriptManager:

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

EDIT: Jeśli absolutnie potrzebujemy tego w sekcji <head>, można zrobić coś takiego:

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

EDIT 2: Według komentarzach, jeśli zauważyć, że

Nie można modyfikować kolekcji Controls, ponieważ kontrolka zawiera bloki kodu (np. <% ...%>)

może trzeba zmienić powyższe używać wiązania danych składni:

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

Tak, jest to wysoce zalecana metoda w wielu książkach ASP.NET, które napisałem podczas pracy ze ścieżkami na stronach wzorcowych. – Kezzer

+0

FYI, mój współpracownik i ja właśnie wypróbowaliśmy to. Wydaje się, że nie działa to w scenariuszu zagnieżdżonych stron wzorcowych * na nadrzędnej stronie wzorcowej *. Przeniesienie go na podrzędną stronę wzorcową jednak rozwiązało problem. – technomalogical

+2

To działało dla mnie na prawie wszystkich moich stronach, ale dla 2 stron, które wysadziłyby się z pewnym wyjątkiem: "Kolekcja kontrolna nie może być zmodyfikowana, ponieważ kontrolka zawiera kod". Rozwiązaniem jest zmiana skryptu uwzględnij w nagłówku z bloku kodu odpowiedzi response.write do analizatora databind (tj. - zmień <% = na <% #). Zaryzykowałbym przypuszczenie, że jest to pewnego rodzaju próba ze strony MS, aby zatrzymać ataki nagłówka http. Lepsze wyjaśnienie tej prostej poprawki można znaleźć na stronie: http://leedumond.com/blog/the-controls-collection-cannot-be-modified-because-control-contains-code-blocks/ – Jagd

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

Problem ze ścieżkami poza korzenia jest to, że czasami można dev w wirtualnego dir a następnie wdrożyć do głównego placu, lub nawzajem. – StuartLC

0

Jeśli ten tag skrypt idzie bezpośrednio do przeglądarki, to mało prawdopodobne, może zastąpić tam korzeń witryny . Przynajmniej nie na serwerze. Więc można:

  1. Deploy witryny do katalogu głównego domeny imieniu i używać bezwzględnych ścieżek (najprostsze rozwiązanie).
  2. Wstaw to łącze ze sterowaniem serwera.
  3. Przetwórz wynikowy kod HTML przed wysłaniem do klienta (z HttpResponse.Filter).
9

Jeśli nie zamierzamy nas asp: ScriptManager lub ścieżki bezwzględne następnie można zrobić to tak:

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

Można również użyć < bazę> tag HTML:

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

, a następnie wszystkie łącza w sekcji nagłówka odnoszą się do adresu podstawowego:

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

Jest to często przydatne, gdy masz wiele miejsc publikacji, takich jak lokalny serwer WWW, serwer demonstracyjny itp. Po prostu zastępujesz podstawowy adres URL.

+0

Jak zmienić? base href' programowo? –

3

Nie wiem, czy znaleźliście rozwiązanie swojego problemu, czy nie. Zmierzyłem się z tym samym problemem i zastanawiałem się, dlaczego otrzymuję komunikat "jQuery jest niezdefiniowany" na wtyczkach, których używam. Wypróbowałem wszystkie rozwiązania, które otrzymałem z Internetu, ale bez powodzenia.

Ale nagle coś rozpryśnie się w moich myślach, które mogą być plikami skryptów, które powinny być w porządku. Więc przeniosłem jquery referece na pierwsze miejsce i wszystko zaczęło działać jak urok.

Pamiętaj, że jeśli używasz wtyczek z jquery, upewnij się, że używasz następującej kolejności ustawienia odniesienia do tych pól.

  1. odniesienie do biblioteki jQuery
  2. odniesienie do innych późniejszych plug-in bibliotek i tak dalej ...

np

  1. "skrypt 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 "...

Zawsze upewnij się, że musisz umieścić odwołanie do jquery najpierw, a następnie kolejne biblioteki.

Mamy nadzieję, że rozwiąże to problem, szczególnie w przypadku korzystania z MasterPages. To bardzo dziwne, że działa niezależnie od tego, jakiej kolejności używasz, kiedy nie używasz MasterPages, ale kiedy to robisz, to w jakiś sposób wymaga odpowiedniej kolejności.

Powodzenia i szczęśliwy kodowanie,

Vincent D'Souza

3

Spójrz na How to Run a Root “/”. Powinno to naprawić wszystkie problemy dotyczące nierozwiązanych ścieżek plików .js. Zasadniczo należy ponownie skonfigurować serwer VS Dev, aby uruchomić aplikację jako localhost:port/, w przeciwieństwie do zwykłej localhost:port/application name/, dzięki czemu rozpoznawanie nazw będzie działać tak samo, jak w przypadku usług IIS.

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

Spróbuj <%# zamiast <%= w stronę wzorcową pod sekcji head

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

Następnie w kod związany z strony wzorcowej pod Page_Load Event

Page.Header.DataBind(); 

Teraz jesteś dobry, aby przejść z albo jQuery i JavaScript oraz CSS wystarczy zmienić ścieżkę w pliku ResolveUrl, który chcesz obsłużyć CSS, JavaScript, jQue ry.

+1

Potrzebowałem linii 'Page.Header.DataBind();' do pracy dla mnie, dzięki! –

+0

Może być również konieczne dodanie atrybutu 'runat =" server "' w znaczniku 'head'. – Alex

0

Dla bezwzględnej ścieżki pliku dla każdego zastosowania it następujący:

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