C# SharePoint AJAX实现:添加了两次ScriptHandler

C# SharePoint AJAX实现:添加了两次ScriptHandler,c#,ajax,sharepoint,scriptmanager,createchildcontrols,C#,Ajax,Sharepoint,Scriptmanager,Createchildcontrols,我目前正在SharePoint环境中设置AJAX功能,以支持我用C#创建的web部件。我使用微软的演练作为出发点,只是为了开始和运行,我遇到了一个我认为是奇怪的错误。CreateChildControls()中出现问题: 我遇到的问题是,出于某种原因,必须调用CreateChildControls()两次。当我逐步完成代码时,它会执行每一行有问题的代码,然后返回到第一行并重复。当它到达添加ScriptManager的倒数第二行时,它当然会抛出一个异常,因为它试图使用相同的键向页面添加第二个Scr

我目前正在SharePoint环境中设置AJAX功能,以支持我用C#创建的web部件。我使用微软的演练作为出发点,只是为了开始和运行,我遇到了一个我认为是奇怪的错误。CreateChildControls()中出现问题:


我遇到的问题是,出于某种原因,必须调用CreateChildControls()两次。当我逐步完成代码时,它会执行每一行有问题的代码,然后返回到第一行并重复。当它到达添加ScriptManager的倒数第二行时,它当然会抛出一个异常,因为它试图使用相同的键向页面添加第二个ScriptManager。也许这是我理解这个方法应该如何工作的一个错误,但我不明白为什么要调用它两次(或者无限递归地调用,据我所知,如果没有抛出异常的话)。谢谢任何人能给我的帮助。

确保您没有在代码中调用
CreateChildControls
。使用
确保ChildControls

确保您没有在代码中调用
CreateChildControls
。使用
EnsureChildControls

您可以在类级别添加一个私有标志-在base.CreateChildControls()之后检查它,并绕过函数的其余部分(如果已设置),然后在添加scriptHandler时设置它,在调试中监视以确保它不是无限循环

还要检查调用堆栈-CreateChildControls()可以从不同的位置调用


另外,作为一个完整的旁白,您是否尝试过Microsoft SharePoint Designer?我在VS 2005中开始使用Ajax为SharePoint开发web控件,但后来发现我可以使用SharePoint Designer来做大多数事情

您可以在类级别添加一个私有标志-在base.CreateChildControls()之后检查它并绕过函数的其余部分(如果已设置),然后在添加scriptHandler时设置它,在调试中监视以确保它不是无限循环

还要检查调用堆栈-CreateChildControls()可以从不同的位置调用


另外,作为一个完整的旁白,您是否尝试过Microsoft SharePoint Designer?我在VS 2005中开始使用Ajax为SharePoint开发web控件,但后来发现我可以使用SharePoint Designer来做大多数事情

我知道这已经标记为已应答,但如果在页面中找不到ScriptManager,则这是插入ScriptManager的代码:


public abstract class WebPartBase : WebPart
{
    protected override void OnInit(EventArgs e)
    {
        if (ScriptManager.GetCurrent(Page) == null)
        {
            ScriptManager scriptManager = new ScriptManager();
            scriptManager.ID = "ScriptManager1";
            scriptManager.EnablePartialRendering = true;
            Page.Form.Controls.AddAt(0, scriptManager);
        }
        base.OnInit(e);
    }
}

所有Web部件都从此基类继承。为清晰起见,删除了所有其他代码,这仅适用于脚本管理器,但您可以处理其中的web部件错误和其他故障。

我知道这已标记为已应答,但如果在页面中找不到脚本管理器,则这是插入脚本管理器的代码:


public abstract class WebPartBase : WebPart
{
    protected override void OnInit(EventArgs e)
    {
        if (ScriptManager.GetCurrent(Page) == null)
        {
            ScriptManager scriptManager = new ScriptManager();
            scriptManager.ID = "ScriptManager1";
            scriptManager.EnablePartialRendering = true;
            Page.Form.Controls.AddAt(0, scriptManager);
        }
        base.OnInit(e);
    }
}

所有Web部件都从此基类继承。为清晰起见,删除了所有其他代码,这仅适用于脚本管理器,但您可以处理其中的web部件错误和其他故障。

我遇到了这个问题,我通过在CreateChildControls末尾将Control.ChildControlCreated标志设置为true来修复它。这与Tom Brown的答案基本相同,但是内置的


您可以在此处阅读更多内容:

我遇到了这个问题,我通过在CreateChildControls末尾将Control.ChildControlCreated标志设置为true来修复它。这与Tom Brown的答案基本相同,但是内置的


您可以在此处阅读更多内容:

我尝试过SharePoint Designer,我非常喜欢它。不幸的是,特别是对于这个web部件,如果这个AJAX功能很快启动并运行,那么在VS中使用它会更快。我来试试,看看会发生什么!成功了!谢谢你的帮助!稍后我会追踪电话的来源,但现在,这还可以。我已经尝试过SharePoint Designer,我非常喜欢它。不幸的是,特别是对于这个web部件,如果这个AJAX功能很快启动并运行,那么在VS中使用它会更快。我来试试,看看会发生什么!成功了!谢谢你的帮助!稍后我会追查电话的来源,但现在还可以。