Программно добавить ScriptManager

Я пытаюсь программно добавить элемент управления ScriptManager, но только в том случае, если его нет на странице. Я нашел много примеров для этого, которые помещают логику внутри Page_Init, что имеет смысл (с тех пор я понял, что это не имеет смысла — см. нижнее редактирование), но я получаю исключение перед моим Метод Init всегда срабатывает.

protected void Page_Init(object sender, EventArgs e)
{
    if (ScriptManager.GetCurrent(Page) == null)
    {
        ScriptManager sMgr = new ScriptManager();
        Page.Form.Controls.AddAt(0, sMgr);
    }
}

Это заставляет меня думать, что Sitecore каким-то образом мешает. Кто-нибудь успешно сделал это с помощью Sitecore?

Спасибо.

EDIT: Исключение, которое я получаю, выглядит следующим образом: «Элементу управления с идентификатором 'filtersUpdatePanel' требуется ScriptManager на странице. ScriptManager должен отображаться перед любыми элементами управления, которым он нужен».

EDIT^2: На самом деле здесь происходило то, что Page_Init слишком поздно в жизненном цикле для присоединения ScriptManager (в моем случае). При использовании Init сначала запускаются все дочерние события, а затем Page. Инициализация UpdatePanel не увидела ScriptManager, поэтому выдала исключение. Помещение логики ScriptManager в инициализацию UpdatePanel решило проблему.


person raynjamin    schedule 07.03.2012    source источник
comment
Не могли бы вы опубликовать исключение?   -  person nickwesselman    schedule 08.03.2012
comment
Ну вот. Это помогло бы, не так ли?   -  person raynjamin    schedule 08.03.2012


Ответы (1)


Что я обычно делаю, так это создаю элемент управления PlaceHolder в своем базовом макете. Затем в моем Page_Init (или в Init элемента управления, для которого требуется ScriptManager, например UpdatePanel) я помещаю следующий код:

if (ScriptManager.GetCurrent(this.Page) == null)
{
    ScriptManager scriptManager = new ScriptManager
    {
        ID = String.Concat("ScriptManager", DateTime.Now.Date.Ticks),
        EnablePartialRendering = true,
        ScriptMode = ScriptMode.Release
    };

    var placeholder = this.Page.FindControl("PlaceHolderScriptManager") as PlaceHolder;

    if (placeholder != null)
    {
        placeholder.Controls.Add(scriptManager);
    }
}

Я немного изменил его без тестирования, но он должен работать нормально.

person Ruud van Falier    schedule 08.03.2012
comment
См. мое редактирование для заметок об этом. Определенно помог мне прийти к ответу! Спасибо. - person raynjamin; 08.03.2012