c# sharepoint-2007 web-parts scriptmanager

c# - Añadir ScriptManager a la página mediante programación



sharepoint-2007 web-parts (7)

Pude hacer que esto funcionara al usar el evento Init de la página:

protected override void OnInit(EventArgs e) { Page.Init += delegate(object sender, EventArgs e_Init) { if (ScriptManager.GetCurrent(Page) == null) { ScriptManager sMgr = new ScriptManager(); Page.Form.Controls.AddAt(0, sMgr); } }; base.OnInit(e); }

Estoy desarrollando un WebPart (se usará en un entorno de SharePoint, aunque no utiliza el Modelo de objetos) en el que quiero exponer la funcionalidad AJAX. Debido a la naturaleza del entorno, es necesario agregar el Administrador de scripts directamente a la página. no es una opción, y por lo tanto debe agregarse programáticamente. Intenté agregar el control ScriptManager a la página en mi código de webpart.

protected override void CreateChildControls() { if (ScriptManager.GetCurrent(Page) == null) { ScriptManager sMgr = new ScriptManager(); // Ensure the ScriptManager is the first control. Page.Form.Controls.AddAt(0, sMgr); } }

Sin embargo, cuando se ejecuta este código, aparece el siguiente mensaje de error:

"La colección de control no se puede modificar durante las fases DataBind, Init, Load, PreRender o Unload".

¿Hay alguna otra forma de agregar el ScriptManager a la página desde un WebPart, o voy a tener que simplemente agregar el ScriptManager a cada página (o página maestra) que usará el WebPart?


He hecho esto y funciona. Crear un marcador de posición para los controles:

<asp:PlaceHolder ID="WebGridPlaceholder" runat="server" > </asp:PlaceHolder>

Entonces puedes hacer esto en CreateChildControls:

ScriptManager aSM = new ScriptManager(); aSM.ID = "GridScriptManager"; WebGridPlaceholder.Controls.Add(aSM);


Tuve este problema similar y encontré que la mejor manera era agregar un ScriptManager global a la página maestra y luego, en el código subyacente, puede agregarlo mediante:

ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference(virtualPath));


Me encontré con este problema con un control de servidor ascx personalizado. Intenté muchas soluciones que implicaban agregar script a los eventos OnInit del control (que no se ejecuta hasta después de que comprueba el control de ScriptManager), agregar lógica dentro de las etiquetas del servidor en el control y agregar cosas a cada otro evento. No es bueno. Finalmente construí un control que hereda de ScriptManagerProxy y luego uso la pieza de código de ktrauberman, ligeramente modificada, para agregar un ScriptManager si es necesario:

public class ProxiedScriptManager : ScriptManagerProxy { protected override void OnInit(EventArgs e) { //double check for script-manager, if one doesn''t exist, //then create one and add it to the page if (ScriptManager.GetCurrent(this.Page) == null) { ScriptManager sManager = new ScriptManager(); sManager.ID = "sManager_" + DateTime.Now.Ticks; Controls.AddAt(0, sManager); } base.OnInit(e); } }

Eso lo hizo por mí.


Tuve el mismo problema básico que el resto de ustedes. Estaba creando un control ascx personalizado y quería poder no preocuparme si la página llamante tenía el scriptmanager declarado o no. Solucioné los problemas añadiendo lo siguiente al contorl de ascx.

a la página ascx -

<asp:PlaceHolder runat="server" ID="phScriptManager"></asp:PlaceHolder>

en el panel de actualización en sí - oninit="updatePanel1_Init"

al archivo ascx.cs -

protected void updatePanel1_Init(object sender, EventArgs e) { if (ScriptManager.GetCurrent(this.Page) == null) { ScriptManager sManager = new ScriptManager(); sManager.ID = "sManager_" + DateTime.Now.Ticks; phScriptManager.Controls.AddAt(0, sManager); } }

Gracias a todos los demás en este hilo que me ayudaron a comenzar.


Esta es la única forma en que puedo hacer que mi panel de actualización funcione en un sitio web compatible con SharePoint 2007/2010. Utilizamos una página maestra de 2010 con un administrador de scripts, pero una página maestra de 2007 sin uno.

.ascx

<asp:PlaceHolder ID="sMgr_place" runat="server" /> <asp:UpdatePanel runat="server" OnInit="updatePanel_Init"><ContentTemplate> ... </ContentTemplate></asp:UpdatePanel>

.ascx.cs

public void updatePanel_Init(object sender, EventArgs e) { if (ScriptManager.GetCurrent(Page) == null) { ScriptManager sMgr = new ScriptManager(); sMgr.EnablePartialRendering = true; sMgr_place.Controls.Add(sMgr); } }


Usé este código en controles web personalizados (.cs) que contienen paneles de actualización.

protected override void OnInit(EventArgs e) { //... if (ScriptManager.GetCurrent(this.Page) == null) { ScriptManager scriptManager = new ScriptManager(); scriptManager.ID = "scriptManager_" + DateTime.Now.Ticks; Controls.AddAt(0, scriptManager); } //... }