以编程方式将脚本管理器添加到页面
本文关键字:添加 管理器 脚本 编程 方式 | 更新日期: 2023-09-27 17:47:22
我正在开发一个WebPart(它将在SharePoint环境中使用,尽管它不使用对象模型),我想在其中公开AJAX功能。 由于环境的性质,将脚本管理器直接添加到页面不是一个选项,因此必须以编程方式添加。 我已尝试将脚本管理器控件添加到我的 Web 部件代码中的页面。
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);
}
}
但是,当执行此代码时,我收到以下错误消息:
"控件集合无法在数据绑定、初始化、加载、预呈现或卸载阶段修改。"
是否有其他方法可以将脚本管理器从 Web 部件添加到页面,还是我必须将脚本管理器添加到将使用 WebPart 的每个页面(或母版页)?
我能够通过使用页面的 Init 事件来使其工作:
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);
}
我遇到了与你们其他人相同的基本问题。 我正在创建自定义 ascx 控件,并希望能够不必担心调用页面是否声明了脚本管理器。 我通过将以下内容添加到ascx控制本身来解决这些问题。
到 ASCX 页面 -
<asp:PlaceHolder runat="server" ID="phScriptManager"></asp:PlaceHolder>
在更新面板本身中 - oninit="updatePanel1_Init"
到 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);
}
}
感谢这个线程中让我开始的其他人。
我已经这样做了,它有效。 为控件创建占位符:
<asp:PlaceHolder ID="WebGridPlaceholder" runat="server" >
</asp:PlaceHolder>
然后你可以在 CreateChildControls 中执行此操作:
ScriptManager aSM = new ScriptManager();
aSM.ID = "GridScriptManager";
WebGridPlaceholder.Controls.Add(aSM);
使用自定义 ascx 服务器控件时遇到了这个问题。我尝试了许多解决方案,包括将脚本添加到控件的 OnInit 事件(直到检查 ScriptManager 控件后才会执行),在控件上的服务器标记内添加逻辑,以及向所有其他事件添加内容。白搭。我最终构建了一个继承自 ScriptManagerProxy 的控件,然后使用 ktrauberman 的代码段(稍作修改)在需要时添加 ScriptManager:
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);
}
}
这对我来说做到了。
这是我可以让我的更新面板在 SharePoint 2007/2010 兼容的 Web 部件中工作的唯一方法。 我们使用带有脚本管理器的 2010 母版页,但不使用脚本管理器的 2007 母版页。
.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);
}
}
我在包含更新面板的自定义 Web 控件 (.cs) 中使用此代码。
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);
}
//...
}
我遇到了类似的问题,发现最好的方法是将全局 ScriptManager 添加到母版页,然后在后面的代码中可以通过以下方式添加到它:
ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference(virtualPath));