SharePoint AJAX实现:ScriptHandler被添加两次

时间:2009-12-16 14:49:28

标签: c# ajax sharepoint scriptmanager createchildcontrols

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

    protected override void CreateChildControls()
    {

        base.CreateChildControls();

        //Fix for the UpdatePanel postback behaviour.
        EnsurePanelFix();

        LinkButton sayHello = new LinkButton();
        UpdatePanel refreshName = new UpdatePanel();
        ScriptManager scriptHandler = new ScriptManager();
        displayName = new Label();
        inputName = new TextBox();

        //Set up control properties.
        this.displayName.ID = "displayName";
        this.displayName.Text = "Hello!";
        this.inputName.ID = "inputName";
        sayHello.ID = "sayHello";
        sayHello.Text = "Say Hello";
        scriptHandler.ID = "scriptHandler";
        refreshName.ID = "refreshName";
        refreshName.UpdateMode = UpdatePanelUpdateMode.Conditional;
        refreshName.ChildrenAsTriggers = true;

        //Add the EventHandler to the Button.
        sayHello.Click += new EventHandler(ClickHandler);

        //Add the user interface (UI) controls to the UpdatePanel.
        refreshName.ContentTemplateContainer.Controls.Add(this.inputName);
        refreshName.ContentTemplateContainer.Controls.Add(sayHello);
        refreshName.ContentTemplateContainer.Controls.Add(this.displayName);

        //The ScriptManager control must be added first.
        this.Controls.Add(scriptHandler);
        this.Controls.Add(refreshName);
    }

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

4 个答案:

答案 0 :(得分:4)

我知道这已经标记为已回答,但如果在页面中找不到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);
    }
}

所有webpart都继承自此基类。为清楚起见,删除了所有其他代码,这只是脚本管理器,但您可以处理Web部件错误和其他故障。

答案 1 :(得分:1)

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

同时检查调用堆栈 - 可以从不同的地方调用CreateChildControls()。

而且,作为一个完整的例外,您是否尝试过Microsoft SharePoint Designer - 我开始使用Ajax在VS 2005中开发SharePoint的Web控件,但随后发现我可以使用SharePoint Designer完成大部分工作。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我遇到了这个问题,我通过在CreateChildControls结束时将Control.ChildControlCreated标志设置为true来修复它。这与汤姆布朗的答案基本相同,但是内置了。

您可以在此处阅读更多内容:http://msdn.microsoft.com/en-us/library/system.web.ui.control.childcontrolscreated.aspx