Probleme mit der ASP.Net-Masterseite und dem Dateipfad


78

Ich versuche, auf meiner Masterseite einen Skriptverweis auf jQuery hinzuzufügen, damit er für jede Seite funktioniert. Es sieht derzeit so aus

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

Das Problem ist, dass der Pfad immer relativ zur ausführenden Aspx-Seite ist, sodass dies nur funktioniert, wenn sich die Datei "jquery.js" im selben Ordner befindet. Damit es funktioniert, muss ich die Zeile ändern in:

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

Dies ist offensichtlich nicht ideal, da es nur für Seiten funktioniert, die zwei Ebenen tief vom Stammordner entfernt sind. Wenn ich Folgendes versuche, gibt IIS einen Fehler über ein unerwartetes Zeichen aus.

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

Irgendwelche Ideen?

EDIT: Ich habe auch vergessen zu erwähnen, dass das Skript im Head-Tag sein muss

Die aktuelle Top-Antwort löst den Fehler "Das clientseitige ASP.NET Ajax-Framework konnte nicht geladen werden " aus, wenn ich es meiner Masterseite hinzufüge. Es wird aus Javascript und nicht aus dem .Net-Compiler geworfen. Wenn ich den ScriptManager in den Kopfbereich verschiebe, in dem er sich befinden soll, wird ein Kompilierungsfehler darüber angezeigt, dass sich der ScriptManager in einem Formular-Tag befinden muss.

Die dritte Antwort löst eine Ausnahme " Unzulässige Zeichen im Pfad " vom Compiler aus

BEARBEITEN 2: Wenn ich diese Zeile zu meinem Head-Tag hinzufüge, erhalte ich diesen Fehler von IIS.

Die Controls-Auflistung kann nicht geändert werden, da das Steuerelement Codeblöcke enthält (dh <% ...%>).

Gelöst: Ich habe die bearbeitete Antwort aus der folgenden Antwort genommen und in ein asp: ContentPlaceHolder- Element eingefügt


Antworten:


110

Sie könnten verwenden ScriptManager:

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

EDIT: Wenn Sie dies in Ihrem Bereich unbedingt benötigen <head>, können Sie Folgendes tun:

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

EDIT 2: Laut den Kommentaren, wenn Sie das beobachten

Die Controls-Auflistung kann nicht geändert werden, da das Steuerelement Codeblöcke enthält (dh <% ...%>).

Möglicherweise müssen Sie die obigen Angaben ändern, um die Datenbindungssyntax zu verwenden:

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

Ja, dies ist eine sehr empfohlene Methode in vielen ASP.NET-Büchern, die ich beim Umgang mit Pfaden auf Masterseiten geschrieben habe.
Kezzer

Zu Ihrer Information, mein Kollege und ich haben das gerade ausprobiert. Dies scheint in einem verschachtelten Masterseiten-Szenario auf der übergeordneten Masterseite nicht zu funktionieren . Das Verschieben auf die untergeordnete Masterseite hat jedoch den Trick getan.
technomalogical

3
Dies funktionierte für mich auf fast allen meinen Seiten, aber für 2 Seiten, die mit einer bestimmten Ausnahme explodierten: "Die Steuerelementsammlung kann nicht geändert werden, da das Steuerelement Code enthält". Die Lösung besteht darin, das Skript-Include im Header von einem response.write-Codeblock in einen Datenbindungs-Evaluator zu ändern (dh <% = in <% # ändern). Ich würde eine Vermutung wagen, dass es eine Art Versuch von MS ist, http-Header-Angriffe zu stoppen. Eine bessere Erklärung für diese einfache Lösung finden Sie unter: leedumond.com/blog/…
Jagd

Verwenden base href?
PreguntonCojoneroCabrón


25

Versuchen Sie es <%#statt auf der <%=Masterseite im Kopfbereich

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

Dann auf der Seite Code hinter dem Master unter Page_LoadEreignis

Page.Header.DataBind();

Jetzt können Sie entweder mit jQuery und JavaScript sowie mit CSS arbeiten. Sie müssen lediglich Ihren Pfad ändern, in ResolveUrlwelcher Datei Sie CSS, JavaScript und jQuery verarbeiten möchten.


1
Page.Header.DataBind();Ich brauchte die Leitung, damit es für mich funktioniert, danke!
Brendan Hannemann

Möglicherweise müssen Sie das runat="server"Attribut auch dem headTag hinzufügen .
Alex

11

Wenn Sie nicht zu uns gehen asp: ScriptManager oder absolute Pfade, können Sie dies folgendermaßen tun:

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

3

Ich weiß nicht, ob ihr die Lösung für euer Problem gefunden habt oder nicht. Ich hatte das gleiche Problem und war verrückt, um herauszufinden, warum ich bei den von mir verwendeten Plugins den Fehler "jQuery ist undefiniert" erhalte. Ich habe alle Lösungen ausprobiert, die ich aus dem Internet bekomme, aber überhaupt kein Glück.

Aber plötzlich spritzt mir etwas in den Sinn, dass die Skriptdateien in Ordnung sein sollten. Also habe ich den JQuery-Schiedsrichter auf die erste Position gebracht und alles funktioniert wie ein Zauber.

Denken Sie daran, Leute, wenn Sie Plugins mit jquery verwenden, stellen Sie sicher, dass Sie die folgende Reihenfolge verwenden, um Verweise auf diese Felder festzulegen.

  1. Verweis auf die jquery-Bibliothek
  2. Verweis auf die anderen nachfolgenden Plug-In-Bibliotheken und so weiter ...

z.B:

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

Stellen Sie immer sicher, dass Sie zuerst die jquery-Referenz und dann die nachfolgenden Bibliotheken angeben müssen.

Ich hoffe, dies löst Ihr Problem, insbesondere wenn Sie es mit MasterPages verwenden. Es ist sehr seltsam, dass es funktioniert, egal welche Reihenfolge Sie verwenden, wenn Sie keine MasterPages verwenden, aber wenn Sie dies tun, dann erfordert es irgendwie die richtige Reihenfolge.

Viel Glück und viel Spaß beim Codieren,

Vincent D'Souza


3

Schauen Sie sich an, wie ein Root "/" ausgeführt wird . Dies sollte alle Ihre Probleme bezüglich ungelöster .jsDateipfade beheben . Grundsätzlich konfigurieren Sie den VS Dev-Server so, dass Ihre Anwendung ausgeführt wird, localhost:port/im Gegensatz zur normalen localhost:port/application name/Namensauflösung, die auf IIS funktioniert.


1

Verwenden Sie den absoluten Pfad der Datei für eine beliebige Seite wie folgt:

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

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

2
Das Problem mit Pfaden außerhalb des Stammverzeichnisses besteht darin, dass Sie manchmal in einem virtuellen Verzeichnis entwickeln und dann im Stammverzeichnis einer Site bereitstellen oder umgekehrt.
StuartLC

0

Wenn dieses Skript-Tag direkt an den Browser gesendet wird, können Sie dort wahrscheinlich nicht das Stammverzeichnis Ihrer Site ersetzen. Zumindest nicht auf dem Server. Also kannst du:

  1. Stellen Sie die Site im Stammverzeichnis des Domänennamens bereit und verwenden Sie absolute Pfade (einfachste Lösung).
  2. Fügen Sie diesen Link mit der Serversteuerung ein.
  3. Verarbeiten Sie den resultierenden HTML-Code vor dem Senden an den Client (mit HttpResponse.Filter).

0

Sie können auch das HTML-Tag <base> verwenden:

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

und dann sind alle Links im Header-Abschnitt relativ zur Basisadresse:

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

Dies ist häufig nützlich, wenn Sie mehrere Veröffentlichungsziele haben, z. B. einen lokalen Entwickler-Webserver, einen Demo-Server usw. Sie ersetzen einfach diese Basis-URL.


Wie kann man base hrefprogrammgesteuert wechseln ?
PreguntonCojoneroCabrón

0
<body>
<script language="javascript" src='<%= this.ResolveClientUrl("~/full/path/to/jquery.js") %>' type="text/javascript"></script>
</body>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.