Реализация SharePoint AJAX: ScriptHandler добавляется дважды
В настоящее время я нахожусь в процессе настройки возможностей AJAX в среде SharePoint для поддержки веб-частей, которые я создаю с помощью C#. Я использую пошаговое руководство 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 ответа
Вы можете добавить частный флаг на уровне класса - проверьте его после своего base.CreateChildControls() и пропустите оставшуюся часть функции, если она установлена, затем установите ее при добавлении scriptHandler, следите за отладкой, чтобы убедиться, что она не бесконечна петля.
Также проверьте стек вызовов - CreateChildControls() может вызываться из разных мест.
И, в конце концов, попробовали ли вы Microsoft SharePoint Designer - я начал разрабатывать веб-элементы управления для SharePoint в VS 2005 с помощью Ajax, но потом обнаружил, что вместо этого я могу делать большинство вещей, используя SharePoint Designer.
Я знаю, что это уже помечено как ответ, но это код, который вставляет 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);
}
}
все веб-части наследуются от этого базового класса. Весь остальной код был удален для ясности, это только делает менеджер скриптов, но вы можете обрабатывать ошибки веб-частей и другие глюки.
У меня была эта проблема, и я исправил ее, установив для флага Control.ChildControlCreated значение true в конце CreateChildControls. Это в основном совпадает с ответом Тома Брауна, но встроено.
Вы можете прочитать больше здесь: http://msdn.microsoft.com/en-us/library/system.web.ui.control.childcontrolscreated.aspx
Убедитесь, что вы не звоните CreateChildControls
в вашем коде. использование EnsureChildControls
вместо.