2009-05-20 4 views
5

Je crée un contrôle de script personnalisé dans ASP.NETAjouter un contrôle à l'en-tête de page dans ASP.NET

Le but du contrôle est tout simplement une variante de serveur de la balise, utilisé pour charger les fichiers javascript Le but principal de ce contrôle est toutefois de combiner plusieurs scripts en une seule réponse. Du côté client, ils voient quelque chose comme tag pour chaque emplacement, de sorte que tous les scripts enregistrés dans l'emplacement DocumentTop seront combinés en une seule étiquette à l'exception du emplacement "en ligne", tous les scripts en ligne sont rendus individuellement où ils existent dans le balisage J'ai également créé un httphandler, js.ashx, qui fait la combinaison réelle des scripts

Tout fonctionne bien sauf pour le « chef » lieu, pour les deux emplacements de document que j'utilise simplement le ClientScriptManager pendant prerender mais pour l'emplacement Head i ont essayé le code suivant lors de la pré rendre

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

et je obtenez l'erreur suivante: La collection de contrôle ne peut pas être modifiée pendant les phases DataBind, Init, Load, PreRender ou Unload.

Est-ce que quelqu'un sait comment ajouter un contrôle à l'en-tête de page à partir d'un contrôle personnalisé? Incidemment, le contrôle est utilisé sur une page de contenu qui a deux maîtres imbriqués et a également un ScriptManager enregistré sur le maître racine. Le projet est un projet d'application web asp.net 3.5

Répondre

8

Ive découvert une réponse à ma question. Je ne comprends pas très bien le pourquoi mais le problème réside quand j'essaie d'ajouter mon contrôle de script dans la tête, le faire dans l'événement PreRender du contrôle provoque mon erreur mais si vous ajoutez le contrôle pendant le PreRender de la page événement tout fonctionne très bien et dandy par exemple:

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

Je ne sais pas pourquoi vous obtenez cette erreur, mais que diriez-vous à l'aide ClientScript comme ça:

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

Salut Canavar J'utilise avec succès le Page.ClientScript pour enregistrer des scripts dans le corps du document, la question tente d'enregistrer une balise de script à l'intérieur de l'étiquette , mes connaissances, this.Page.ClientScript.RegisterClientScriptInclude enregistre le js juste après la balise

dans le corps – 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

Bienvenue sur stackoverflow! Il est toujours préférable de fournir une brève description d'un exemple de code pour améliorer la précision de la publication :) –

Questions connexes