2009-12-30 12 views
17

Sto lavorando all'interno di un controllo utente Web (.ascx) che verrà incluso in un normale modulo Web (.aspx), ma devo essere in grado di inserire dinamicamente codice nella testa del documento dal controllo utente. Nei miei giorni di Coldfusion <cfhtmlhead> farebbe il trucco. C'è un equivalente di questo in ASP.NET o un hack simile?ASP.NET inserisce dinamicamente il codice nella testa

+0

Le risposte di seguito sembrano affidarsi tutte all'intestazione con un attributo runat = "server", altrimenti Page.Header è nullo. – user420667

risposta

29

Per aggiungere markup HTML è possibile effettuare le seguenti operazioni:

Nel codice del UserControl è possibile accedere Page.Header, che è essa stessa un controllo. Per quel controllo è quindi possibile aggiungere nuovi controlli:

HtmlGenericControl newControl = new HtmlGenericControl("someTag"); 
newControl.Attributes["someAttr"] = "some value"; 
Page.Header.Controls.Add(newControl); 

Per aggiungere script di markup non è necessario l'accesso al tag testa a tutti in quanto ASP.NET dispone di metodi helper sul ClientScriptManager che fare il lavoro per voi:

Ecco alcuni esempi di codice si può anche mettere nel codice di controllo utente:

// Register some inline script: 
Page.ClientScript.RegisterClientScriptBlock(GetType(), "myAlertScript", "alert('hello!')", true); 

// Register a script reference: 
Page.ClientScript.RegisterClientScriptInclude(GetType(), "myLibraryScript", "~/Scripts/MyScriptLibrary.js"); 
+2

Sto cercando di aggiungere alcuni Javascript all'inizio del documento. – Kyle

+0

Grazie, il secondo metodo sembra funzionare al meglio per me. – Kyle

9
this.Page.Header.Controls.Add 

In questo modo, si aggiungono i controlli alla sezione della testa. È possibile aggiungere qualsiasi tipo di controllo. Se ritieni di aver bisogno di aggiungere un testo semplice (o di voler scrivere manualmente i tag), cerca nella classe LiteralControl.

2

c'è qualche guida all'uso di codice C# per modificare la pagina di intestazione here. Dovrebbe funzionare bene da qualsiasi codice lato server che viene eseguito prima del completamento del caricamento della pagina.

Un semplice ad es.

HtmlHead head = Page.Header; 
HtmlTitle title = new HtmlTitle(); 
title.Text = "Test Page"; 
head.Controls.Add(title); 

riferimento HTMLHead è nel namespace

System.Web.UI.HtmlControls 

Override Load del controllo personalizzato() metodo per aggiungere i controlli o riferimenti che vi interessano nelle l'intestazione della pagina mentre la pagina aspx genitore viene caricata su server lato.

0

Ho una soluzione semplice per questo. Crea una cache di memoria di runtime basata sull'URL della pagina (come chiave) che contiene x informazioni su y (che si tratti di un riferimento di file, testo di script o classe che genera JavaScript) e serializza i suoi dati su JSON. Newtonsoft è utile per le istanze di qualsiasi classe. In effetti, puoi usare il suo output per inizializzare qualsiasi nuova istanza di una classe sulla base di un dato input. In un certo senso, ciò significa che è possibile che le istanze di una particolare classe vengano istanziate automaticamente nonostante il controllo dell'utente sull'istanza. Alla fine, si crea un semplice modulo Web da utilizzare come riferimento di script e come endpoint finale. Estrae il codice JavaScript (o quello che ha) e sputa il codice lato client di cui hai bisogno come riferimento di script all'interno del tag head.

10

Mi rendo conto che questa è una domanda vecchia, ma questo è un altro esempio.

Try This:

Page.Header.Controls.Add(
    new LiteralControl(
     "<script>alert('Literal Added to <Head>.');</script>" 
    ) 
); 

Se si desidera aggiungere lo script in un particolare indice del <head> è possibile utilizzare

AddAt(index, new LiteralControl(...)) dove l'indice 0 è uguale alla parte superiore del <head>

anche , è necessario aggiungere runat="server" nel tag head ad es <head id="head1" runat="server">

Problemi correlati