2009-05-20 15 views
5

Sto creando un controllo di script personalizzato in ASP.NETAggiungere un controllo per l'intestazione della pagina in ASP.NET

Lo scopo del controllo è semplicemente una variante del server del tag, utilizzato per caricare i file javascript Lo scopo principale di questo controllo è tuttavia quello di combinare più script in un'unica risposta, in modo che sul lato client vedano qualcosa come il tag per ogni posizione, quindi tutti gli script registrati nella posizione DocumentTop verranno combinati in un singolo tag ad eccezione del posizione "in linea", tutti gli script inline sono resi individualmente laddove esistono nel markup Ho anche creato un httphandler, js.ashx, che fa la combinazione effettiva degli script

Tutto sta funzionando benissimo tranne per la posizione "Testa", per le due posizioni documento che è sufficiente utilizzare il ClientScriptManager durante PreRender ma per la posizione capo Ho provato il seguente codice in fase di pre rendere

var scriptControl = new HtmlGenericControl("script"); 
scriptControl.Attributes["language"] = "javascript"; 
scriptControl.Attributes["type"] = "text/javascript"; 
scriptControl.Attributes["src"] = src; 
Page.Header.Controls.Add(scriptControl); 

ed io ottenere il seguente errore: La raccolta di controlli non può essere modificata durante le fasi DataBind, Init, Load, PreRender o Unload.

qualcuno sa come aggiungere un controllo all'intestazione della pagina da un controllo personalizzato?

Per inciso, il controllo viene utilizzato su una pagina di contenuto con due master nidificati e uno ScriptManager registrato sul master principale. Il progetto è un progetto di applicazione asp.net 3.5 web

risposta

8

Ive scoperto una risposta alla mia domanda

Non capisco il perché, ma il problema si trova quando sto provando ad aggiungere il controllo del mio script in testa, farlo nell'evento PreRender del controllo causa il mio errore ma se aggiungete il controllo durante il PreRender della Pagina evento tutto funziona bene e dandy esempio:

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    this.Page.PreRender += new EventHandler(Page_PreRender); 
} 

void Page_PreRender(object sender, EventArgs e) 
{ 
    var scriptControl = new HtmlGenericControl("script"); 
    Page.Header.Controls.Add(scriptControl); 
    scriptControl.Attributes["language"] = "javascript"; 
    scriptControl.Attributes["type"] = "text/javascript"; 
    scriptControl.Attributes["src"] = "blah.js"; 
} 
3

Non so il motivo per cui si ottiene questo errore, ma come circa usando ClientScript così:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string scriptFile = "myscriptFile.js"; 

    if (!this.Page.ClientScript.IsClientScriptIncludeRegistered("myScript")) 
    { 
     this.Page.ClientScript.RegisterClientScriptInclude("myScript", scriptFile); 
    } 
} 

ClientScriptManager.RegisterClientScriptInclude Method

+0

Hi Canavar adesso utilizzo del Page.ClientScript per registrare script nel corpo del documento, il problema sta cercando di registrare un tag script all'interno del tag , a la mia conoscenza, this.Page.ClientScript.RegisterClientScriptInclude registra il js subito dopo il tag

all'interno del corpo – Lightweight

0
protected void Page_Load(object sender, EventArgs e) 
    {   
     HtmlGenericControl js = new HtmlGenericControl("script"); 
     js.Attributes["type"] = "text/javascript"; 
     js.Attributes["src"] = yol.ScriptYol("jquery-1.3.2.min.js"); 
     this.Page.Header.Controls.Add(js); 

    } 
1
protected override void OnInit(EventArgs e) 
{ 
    EnsureChildControls(); 
    base.OnInit(e); 
} 
+5

Benvenuti in stackoverflow! È sempre meglio fornire una breve descrizione per un codice di esempio per migliorare l'accuratezza del post :) –