У меня есть то, что я считаю, должно быть довольно простой проблемой, но для жизни меня я не вижу своей проблемы. Проблема связана с ScriptManager.RegisterStartupScript, то, что я использовал много раз раньше.
Сценарий, который у меня есть, заключается в том, что у меня есть настраиваемый веб-элемент управления, который был вставлен на страницу. Элемент управления (и один или два других) вложен внутри UpdatePanel. Они помещаются на страницу на PlaceHolder:
<asp:UpdatePanel ID="pnlAjax" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="placeholder" runat="server">
</asp:PlaceHolder>
...
protected override void OnInit(EventArgs e){
placeholder.Controls.Add(Factory.CreateControl());
base.OnInit(e);
}
Это единственная панель обновления на странице.
Элемент управления требует запуска некоторого начального javascript для правильной работы. Управление вызывает:
ScriptManager.RegisterStartupScript(this, GetType(),
Guid.NewGuid().ToString(), script, true);
и я также пробовал:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
Проблема в том, что script работает правильно, когда страница сначала отображается, но не возвращается после частичной обратной передачи. Я пробовал следующее:
- Вызов RegisterStartupScript из CreateChildControls
- Вызов RegisterStartupScript из OnLoad/OnPreRender
- Использование разных комбинаций параметров для первых двух параметров (в приведенном выше примере Control - это страница и тип GetType(), но я попытался использовать сам элемент управления и т.д.).
- Я пытался использовать постоянные и новые идентификаторы (не то, что я считаю, что это должно иметь большое влияние в любом случае).
- Я использовал несколько точек останова и поэтому проверил, что строка Register вызывается правильно.
Единственное, что я не пробовал, - это использование самой UpdatePanel как элемента управления и типа, так как я не считаю, что элемент управления должен знать панель обновления (и в любом случае, похоже, получить панель обновления?).
Может ли кто-нибудь увидеть, что я могу сделать неправильно в вышеупомянутом?
Спасибо:)
Хорошо, чтобы ответить на запрос выше - он выглядит так, как будто placeholder каким-то образом запутывает ScriptManager.RegisterStartupScript.
Когда я вытаскиваю элемент управления из заполнителя и кодирую его непосредственно на страницу, регистр Register script работает правильно (я также сам использую элемент управления в качестве параметра).
ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);
Может ли кто-нибудь проливать свет на то, почему введенный элемент управления на PlaceHolder помешает ScriptManager правильно зарегистрировать script? Я предполагаю, что это может иметь какое-то отношение к жизненному циклу динамических элементов управления, но я бы оценил (для моих собственных знаний), если есть правильный процесс для вышеуказанного.