以编程方式将ScriptManager添加到页面?

我正在开发一个WebPart(它将在SharePoint环境中使用,虽然它不使用对象模型)我想要公开AJAXfunction。由于环境的性质,直接向页面添加脚本管理器是不是一个选项,因此必须以编程方式添加。 我试图将ScriptManager控件添加到我的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); } } 

但是,执行此代码时,我收到以下错误消息:

“在DataBind,Init,Load,PreRender或Unload阶段,无法修改控件集合。”

是否有另一种方法将ScriptManager从WebPart添加到页面中,或者我只需要将ScriptManager添加到将使用WebPart的每个页面(或母版页)?

我能够通过使用Page的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); } 

我做到了这一点,它的确有效。 为控件创建占位符:

   

然后你可以在CreateChildControls中执行此操作:

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

我用自定义的ascx服务器控件遇到了这个问题。 我尝试了许多解决方案,包括向控件的OnInit事件添加脚本(在检查ScriptManager控件之前不会执行),在控件上的服务器标签内添加逻辑,并向其他所有事件添加内容。 不好。 我最终构建了一个inheritance自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); } } 

这样做对我而言。

我和你们其他人有同样的基本问题。 我正在创建一个自定义的ascx控件,并希望能够不担心调用页面是否声明了scriptmanager。 我通过在ascx contorl本身添加以下内容来解决这些问题。

到ascx页面 –

在更新面板本身 – 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); } } 

感谢这个让我开始的线程中的其他人。

这是我可以让我的更新面板在兼容性的2007/2010兼容webpart中工作的唯一方法。 我们使用带有scriptmanager的2010母版页,但没有一个2007母版页。

的.ascx

   ...  

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