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);
}
//...
}