Реализация SharePoint AJAX: ScriptHandler добавляется дважды - PullRequest
0 голосов
/ 16 декабря 2009

В настоящее время я нахожусь в процессе настройки возможностей 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 ]

4 голосов
/ 16 декабря 2009

Я знаю, что это уже помечено как ответ, но это код, который вставляет 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);
    }
}

все веб-части наследуются от этого базового класса. Весь остальной код был удален для ясности, это только диспетчер скриптов, но вы можете обрабатывать ошибки веб-частей и другие глюки там.

1 голос
/ 16 декабря 2009

Вы можете добавить частный флаг на уровне класса - проверьте его после своего base.CreateChildControls () и пропустите оставшуюся часть функции, если она установлена, затем установите его при добавлении scriptHandler, следите за отладкой, чтобы убедиться, что не бесконечный цикл.

Также проверьте стек вызовов - CreateChildControls () может вызываться из разных мест.

И, в конце концов, вы уже пробовали Microsoft SharePoint Designer - я начал разрабатывать веб-элементы управления для SharePoint в VS 2005 с помощью Ajax, но потом обнаружил, что вместо этого я могу делать большинство вещей, используя SharePoint Designer.

0 голосов
/ 09 марта 2012

У меня была эта проблема, и я исправил ее, установив для флага Control.ChildControlCreated значение true в конце CreateChildControls. Это в основном совпадает с ответом Тома Брауна, но встроено.

Вы можете прочитать больше здесь: http://msdn.microsoft.com/en-us/library/system.web.ui.control.childcontrolscreated.aspx

0 голосов
/ 16 декабря 2009

Убедитесь, что вы не звоните CreateChildControls в своем коде. Вместо этого используйте EnsureChildControls.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...