0

我目前正在 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

4 回答 4

4

我知道这已经被标记为已回答,但如果在页面中找不到,这是插入 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 部件错误和其他故障。

于 2009-12-16T19:34:44.543 回答
1

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

还要检查调用堆栈 - CreateChildControls() 可能会从不同的地方调用。

而且,顺便说一句,您是否尝试过 Microsoft SharePoint Designer - 我开始使用 Ajax 在 VS 2005 中为 SharePoint 开发 Web 控件,但后来发现我可以使用 SharePoint Designer 来做大部分事情。

于 2009-12-16T15:05:41.357 回答
0

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

于 2009-12-16T14:59:52.620 回答
0

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

你可以在这里阅读更多:http: //msdn.microsoft.com/en-us/library/system.web.ui.control.childcontrolscreated.aspx

于 2012-03-08T22:54:08.887 回答