2010-03-16 3 views
5

Ich habe eine ASP.net-Masterseite. In diesem Master habe ich alle meine CSS- und JavaScript-Dateien definiert. Ich habe auch ein paar Bilder und ein paar Buttons und Hyperlinks.Basis-URL in ASP.net-Masterseiten mit virtuellen Verzeichnissen

alle URLs werden als relativ deklariert dh „/scripts/ian.js“

Alles funktioniert gut, wenn diese Seite die Wurzel Website ist, aber ich muss es in einem virtuellen Verzeichnis arbeiten.

Mein Problem ist, wenn ich diese Website in einem virtuellen Verzeichnis unter einer Stammwebsite platzieren, zeigen alle meine Links auf die Stammwebsite. also meine Links zeigen auf www.root.com/scripts/ian.js aber es sollte auf www.root.com/virtualDir/scripts/ian.js zeigen

Ich dachte, die Base Href-Tag in der Kopfzeile würde helfen, aber bisher scheint es auf keinen Fall zu helfen. Alle Links zeigen immer noch auf die Root-Website, wenn ich den Mauszeiger darüber bewege.

Was ich möchte, ist eine einzige Einstellung entweder in IIS oder der Konfigurationsdatei, die ich eine Root-URL festlegen kann und jedes Bild, Skript oder Link auf der Masterseite oder Inhaltsseite, würde auf den richtigen Platz zeigen.

Alle Anregungen oder Ideen sind willkommen.

Dank

Antwort

6

Urls sind alle erklärt als relativ dh "/scripts/ian.js"

scheinen Die absolute URL zu sein, dass Sie verwenden, anstatt relativen URLs, was wahrscheinlich ist, warum der <base /> Tag die gewünschte Wirkung nicht mit:

Dieses Attribut gibt einen absoluten URI, fungiert als der Basis-URI für , der relative URIs auflöst.

- von http://www.w3.org/TR/html401/struct/links.html#h-12.4

Sie könnten versuchen, die führende ‚/‘ von Ihrer URL zu entfernen, um zu sehen, ob das funktioniert?

dass Failing, neige ich ResolveClientUrl zu verwenden, wie dies zu umgehen, Fragen, die Sie in der gleichen Art und Weise verwenden würden, wie andere vorgeschlagen haben mit ResolveUrl:

<script type="text/javascript" src="<%= ResolveClientUrl("~/path/to/js") %>"></script> 
... 
<img src="<%= ResolveClientUrl("~/path/to/img") %>" alt="..." /> 

Hoffnung, das hilft.

0

Verwenden Tilde (~) in yout Referenz (d ~/scrips/ian.js) ... sehen, ob es Für Links versucht Page.ResolveUrl in der ASPX-Seite funktioniert.

+0

Nein, Tilde funktioniert nicht für Skripts. Sie erhalten einen Fehler, wenn der Server versucht, das Skript auszuführen. –

2

Die meisten Tags, einschließlich dem regelmäßigen HTML-Tags wie <Link>, <img>, etc die ~/ als Anwendungsstammpfad verwenden kann, wenn die * 'runat = "server"' Attribut gesetzt.

z.

<img src="~/images/test.png" runat="server" /> 

Dies macht Tag ein Server-Tag und die Tilde wird durch den Anwendungsstamm ersetzt, bevor die Ausgabe an den Browser zurückgegeben wird.

Dies funktioniert nicht wie erwartet für die <Skript> obwohl. Wenn ‚runat =" server‘ für den Script-Tag gesetzt ist, dann wird das Skript als Server-Seite sein javascript und Ausführung versucht wird.

Um dies zu umgehen, können Sie entweder injizieren, um das mit Hilfe von Javascript one of the register client script Methoden. alle Ihre können Sie die <% = ResolveUrl ('~')% > Tag in Ihrem Skript-Tag.

+0

Gibt es keine globale Einstellung, die ich einstellen kann, also muss ich nicht alle Links, Bilder, Skripte usw. aktualisieren? PS. Thx – SetiSeeker

+0

Nicht, dass ich davon weiß. Ich versuche immer "~" relative Pfade oder Ordner relative Pfade zu verwenden. "../etwas". Dies ermöglicht das Verschieben der Anwendung in der Zukunft. Ein guter Regex zum Suchen/Ersetzen sollte in der Lage sein, die meisten, wenn nicht alle Ihre beleidigenden Links zu erfassen. – kervin

+0

Während Sie für CSS-Dateireferenzen "~" mit runat = server verwenden können, führt dies bei JavaScript-Dateien höchstwahrscheinlich zu Fehlern, da JavaScript-Ausführungscode auf der Serverseite erzwungen wird. –

2

Diese statische Methode liefert Ihnen die vollen http Pfad zum Stammordner Ihrer Anwendung (Web-Site oder ein virtuelles Verzeichnis)

public static string GetAppRootUrl(bool endSlash) 
{ 
    string host = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); 

    string appRootUrl = HttpContext.Current.Request.ApplicationPath; 
    if (!appRootUrl.EndsWith("/")) //a virtual 
    { 
     appRootUrl += "/"; 
    } 
    if (!endSlash) 
    { 
     appRootUrl = appRootUrl.Substring(0, appRootUrl.Length - 1); 
    } 
    return host + appRootUrl; 
} 

So können Sie in Master-Seite schreiben:

<script src="<%= Server.HtmlEncode(GetAppRootUrl(false)) %>/scripts/ian.js" language="javascript" type="text/javascript"></script> 
0

I So fand diese IIS Seltsamkeit letzte Nacht:

Wird nicht richtig in einer virtuellen Anwendung funktionieren ist in einem Unterverzeichnis der wichtigsten IIS-Site.

Stattdessen müssen Sie es wie folgt tun:

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

Welche der normale Weg ist, es zu tun, aber wenn Sie nicht danach suchen, kann es Sie überraschen, dass das zusätzliche Tag die relative macht Pfadprobleme gehen weg.

Verwandte Themen