Kyl*_*man 28 c# web-parts scriptmanager sharepoint-2007
我正在开发一个WebPart(它将在SharePoint环境中使用,虽然它不使用对象模型)我想要公开AJAX功能.由于环境的性质,直接向页面添加脚本管理器是不是一个选项,因此必须以编程方式添加.我试图将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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,执行此代码时,我收到以下错误消息:
"在DataBind,Init,Load,PreRender或Unload阶段,无法修改控件集合."
是否有另一种方法将ScriptManager从WebPart添加到页面中,或者我是否只需将ScriptManager添加到将使用WebPart的每个页面(或母版页)?
Kyl*_*man 41
我能够通过使用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);
}
Run Code Online (Sandbox Code Playgroud)
我做到了这一点并且有效.为控件创建占位符:
<asp:PlaceHolder ID="WebGridPlaceholder" runat="server" >
</asp:PlaceHolder>
Run Code Online (Sandbox Code Playgroud)
然后你可以在CreateChildControls中执行此操作:
ScriptManager aSM = new ScriptManager();
aSM.ID = "GridScriptManager";
WebGridPlaceholder.Controls.Add(aSM);
Run Code Online (Sandbox Code Playgroud)
我用自定义的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);
}
}
Run Code Online (Sandbox Code Playgroud)
这样做对我来说.
小智 5
我和你们其他人有同样的基本问题.我正在创建一个自定义的ascx控件,并希望能够不担心调用页面是否声明了scriptmanager.我通过在ascx contorl本身添加以下内容解决了这些问题.
到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);
}
}
Run Code Online (Sandbox Code Playgroud)
感谢这个让我开始的线程中的其他人.
| 归档时间: |
|
| 查看次数: |
48374 次 |
| 最近记录: |