Реализация 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 вместо.

Другие вопросы по тегам