我目前正在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添加到具有相同键的页面。也许这是我理解这个方法应该如何工作的一个错误,但是我不明白为什么它被调用两次(或者无限递归,对于所有我知道的,如果没有抛出异常)。感谢任何人都能给我的帮助。
答案 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