2009-05-20 32 views
5

Estoy creando un control de secuencia de comandos personalizada en ASP.NETAgregue un control a la cabecera de la página en ASP.NET

El objetivo del control es simplemente una variante del servidor de la etiqueta, que se utiliza para cargar los archivos de javascript Sin embargo, el objetivo principal de este control es combinar varios scripts en una respuesta, por lo que en el lado del cliente se ve algo como para cada ubicación, por lo que todos los scripts registrados en la ubicación de DocumentTop se combinarán en una única etiqueta, a excepción del ubicación "en línea", todos los scripts en línea se representan individualmente donde existen en el marcado También he creado un httphandler, js.ashx, que hace la combinación real de los scripts

Todo está funcionando bien excepto por la ubicación "Cabeza", para las dos ubicaciones de los documentos i basta con utilizar el ClientScriptManager durante prerender pero por la ubicación Cabeza He probado el siguiente código durante la pre rendir

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

y yo Obtenga el siguiente error: La recopilación de control no se puede modificar durante las fases DataBind, Init, Load, PreRender o Unload.

¿Alguien sabe cómo agregar un control al encabezado de página desde un control personalizado?

Dicho sea de paso, el control se utiliza en una página de contenido que tiene dos maestros anidados y también tiene un ScriptManager registrado en el maestro de la raíz. El proyecto es un proyecto de aplicación web asp.net 3.5

Respuesta

8

he descubierto una respuesta a mi pregunta

No entiendo muy bien por qué, pero el problema radica en cuando intento agregar el control de mi script en la cabeza, hacerlo en el evento PreRender del control provoca mi error, pero si agrega el control durante el preRender de la página evento que todo funciona bien y dandy por ejemplo:

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

No sé por qué se obtiene este error, pero ¿qué hay de usar ClientScript así:

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

Hola Canavar Estoy con éxito utilizando el Page.ClientScript registrar secuencias de comandos en el cuerpo del documento, el problema está intentando registrar una etiqueta de script dentro de la etiqueta , a mi conocimiento, this.Page.ClientScript.RegisterClientScriptInclude registra el js justo después de la etiqueta

dentro del cuerpo – 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

¡Bienvenido a stackoverflow! Siempre es mejor proporcionar una breve descripción de un código de muestra para mejorar la precisión de la publicación :) –

Cuestiones relacionadas