2010-03-16 11 views
5

Ho una pagina master di ASP.net. In questo master, ho definito tutti i miei file css e javascript. Ho anche alcune immagini e alcuni pulsanti e collegamenti ipertestuali.URL di base in pagine master ASP.net con directory virtuali

tutti gli URL sono tutti dichiarati come relativo cioè "/scripts/ian.js"

Tutto funziona bene se questo sito è il sito principale, ma ho bisogno di lavorare in una directory virtuale.

Il mio problema è quando inserisco questo sito Web in una directory virtuale in un sito radice, tutti i miei collegamenti puntano al sito di root. quindi i miei collegamenti rimandano a www.root.com/scripts/ian.js ma dovrebbero puntare a www.root.com/virtualDir/scripts/ian.js

Ho pensato che il tag Base Href nell'intestazione aiuterebbe, ma finora non sembra essere di aiuto in ogni caso. Tutti i collegamenti puntano ancora al sito Web principale quando si passa il mouse su di essi.

Quello che vorrei è una singola impostazione in IIS o nel file di configurazione che posso impostare un URL radice e qualsiasi immagine, script o collegamento sia sulla pagina principale che sulla pagina di contenuto, farebbe riferimento al posto giusto.

Eventuali suggerimenti o idee sono i benvenuti.

Grazie

risposta

6

tutti gli URL sono tutti dichiarati come relativa cioè "/scripts/ian.js"

quelli sembrano essere assoluta URL che si sta utilizzando, invece di URL relativo di, che è probabilmente il motivo per cui il tag <base /> non sta avendo l'effetto desiderato:

Questo attributo specifica un assoluto URI che funge da l'URI di base per che risolve gli URI relativi.

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

Si potrebbe provare a rimuovere il leader '/' dal URL per vedere se funziona?

In mancanza di questo, tendo a usare ResolveClientUrl per aggirare problemi come questo, che usereste nello stesso modo come altri hanno suggerito di usare ResolveUrl:

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

Spero che questo aiuti.

0

Usa tilde (~) in riferimento yout (cioè ~/scrips/ian.js) ... vedere se funziona Per i collegamenti cercano Page.ResolveUrl nella pagina aspx.

+0

No, la tilde non funziona per gli script. Si verificherà un errore quando il server tenta di eseguire lo script. –

2

maggior parte dei tag, tra regolari tag HTML come <collegamento>, <img>, ecc può utilizzare il ~/ come percorso radice dell'applicazione se l'attributo * 'runat = "server"' è impostato.

es.

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

Questo rende tag un tag server e la tilde viene sostituito con la radice dell'applicazione prima che l'uscita viene restituito al browser.

Questo non funziona come previsto per lo script < >. Quando 'runat = "server' è fissato per il tag script, lo script è considerato come server-side JavaScript e l'esecuzione è tentato.

Per aggirare questo è possibile iniettare il JavaScript utilizzando one of the register client script metodi. la vostra è possibile utilizzare il <% = ResolveUrl ('')% > tag nel tag script.

+0

Non ci sono impostazioni globali che posso impostare in modo da non dover andare e aggiornare tutti i collegamenti, immagini, script ecc.? PS. Thx – SetiSeeker

+0

Non che io sappia. Cerco sempre di usare "~" percorsi relativi o percorsi relativi alle cartelle es. "../qualcosa". Ciò consente di spostare l'applicazione in futuro. Un buon find/replace regex dovrebbe essere in grado di catturare la maggior parte se non tutti i link offensivi. – kervin

+0

Sebbene sia possibile utilizzare "~" con runat = server per i riferimenti ai file CSS, fare ciò per i file JavaScript causerà molto probabilmente degli errori, poiché imporrà il codice di esecuzione JavaScript sul lato server. –

2

Questo metodo statico si ritorna percorso completo http alla cartella principale della vostra applicazione (sito web o directory virtuale)

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; 
} 

Quindi, si può scrivere in pagina master:

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

Così ho trovato questa stranezza IIS la scorsa notte:

<script src="/js/file.js"></script> 

Non funziona correttamente in un'applicazione virtuale che è in una sottodirectory del sito principale di IIS.

Invece, si deve fare in questo modo:

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

Qual è il modo standard per farlo, ma se non siete in cerca di esso, può sorprendere che il tag aggiuntivo rende la relativa i problemi del percorso vanno via.

Problemi correlati