2010-03-11 14 views
5

Woo, ho un doozy di un problema (potrebbe anche essere uno per il Daily WTF) e spero che ci sia una soluzione. (Le mie scuse per il lungo post ...)Alternativa a Page_Load in ASP.NET (e una buona storia WTF)

Ho lavorato a un sito web che ho ereditato circa un mese fa. Una delle parti su cui ho lavorato è quella di correggere uno dei controlli (essenzialmente una barra di intestazione dinamica) in modo che mostri informazioni aggiuntive come richiesto dai miei utenti. Come parte di questo progetto, ho creato un file Site.master in modo che non avrei dovuto ricodificare la barra dell'intestazione in ogni singola pagina. Quando ho iniziato a farlo, sembrava che funzionasse molto bene. Tutte le pagine che avevo sviluppato erano fantastiche e la barra aggiornata come dovrebbe mostrare le informazioni come dovrebbe.

Bene, quando ho eliminato Site.master (e questo controllo) in pagine del sito più vecchie (quelle che non sviluppavo in modo specifico) ho notato che su alcuni di essi sembrava non corretto, ma non tutti. Quando dico che sembrava male, in pratica, il controllo sarebbe rimasto allineato alla pagina anziché al centro come avrebbe dovuto. Ho passato un paio di ore di debug senza alcun risultato - il CSS sembrava corretto, l'HTML sembrava essere a posto, non ho visto nulla nel Javascript (anche se mi è mancato qualcosa che indicherò in un secondo), e persino il vecchio codice sembrava corretto (al meglio che poteva - non è scritto molto bene). Un altro collega ha dato un'occhiata al sito e non è riuscito a trovare nulla all'inizio.

Non è stato fino a quando ho pensato di guardare il codice sorgente della pagina reso (avevo lavorato nella vista sviluppatore fino a questo punto in IE8) che è diventato chiaro cosa c'era di sbagliato.

Lo sviluppatore originale esegue ricerche su molte pagine. Per fare ciò, interroga il database per TUTTI i dati e li carica in array di Javascript all'interno della pagina in modo che possa accedervi. Questo di per sé è un grosso problema perché stiamo parlando di migliaia di articoli, e ovviamente non è scalabile (e, sì, il sito è lento). Tuttavia, ha finalmente fatto clic su cosa stava rovinando il Site.master - quando carica i dati negli array Javascript, scrive i dati nell'HTML su Page_Load utilizzando numerose chiamate Response.Write (stringa). Il WTF (e quello che mi stava facendo incazzare) è che lui inserisce il Javascript prima del DOCTYPE, facendo sì che IE entri in modalità quirks!

Quindi, perché ho bisogno di ottenere almeno questo rilascio (risolverò il problema reale più tardi), mi chiedevo: c'è un modo per forzare questo Javascript ad essere inserito altrove nell'HTML — dopo il DOCTYPE per lo meno? Al momento, tutte le chiamate Response.Write() vengono eseguite nel metodo Page_Load. Ho solo bisogno che vengano inseriti più tardi.

risposta

5

Ci sono diversi modi per farlo, molto probabilmente il modo "giusto" per farlo sarebbe quello di costruire la stringa, quindi usare il metodo Page.ClientScript.RegisterClientScriptBlock per registrare il JS, questo lo metterà nel giusto place

Un'altra alternativa, più rapida e sporca sarebbe quella di aggiungere un controllo alla pagina e piuttosto che response.write, creare il JS, quindi impostare la proprietà di testo del controllo letterale.

+0

+1 - abbiamo pubblicato * lo stesso secondo *, ma la tua risposta è migliore :) –

+0

Grazie, in realtà ho riformulato anche questo, perché tecnicamente Page.ClientScript è il modo "migliore" e giusto per farlo ... –

0

Inserire il codice JavaScript generato in una proprietà sulla pagina principale e gestirlo dalla pagina master. La pagina principale esegue il rendering di dopo le pagine incapsulate, ma i membri sono disponibili per le pagine di contenuto.

1

Il modo più semplice per sostituire le chiamate Response.Write probabilmente quella di utilizzare uno StringBuilder:

StringBuilder sb = new StringBuilder(); 
sb.Append("your script writes here"); // instead of Response.Write 

e usare la pagina.ClientScript manager per mettere lo script dove potrebbe essere utilizzato. Ci sono diversi metodi per registrare il copione, e ognuno pone lo script in diverse posizioni sulla pagina, a seconda del ciclo di vita del controllo della corrente ci si trova in Ecco un esempio (già coperto sopra):.

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "yourScriptKey", sb.ToString()); 
Problemi correlati