Странная новая ошибка с ASP: комбинация Panel / UserControl / UpdatePanel - PullRequest
0 голосов
/ 10 марта 2010

Я постараюсь быть здесь как можно более информативным. У нас есть некоторый код, который работал, а теперь, без изменений, нет. Я выделил проблему, поэтому вот ситуация:

У нас есть страница ASPX, и на ней есть 2 элемента управления asp: Panel (Panel1 и Panel2). В каждой из этих панелей есть один WebUserControl (Panel1 содержит UserControl1, Panel2 содержит UserControl2). На этой странице есть набор скриптов AJAX, и это все. При первом посещении пользователем страница Panel1 отображается, а Panel2 скрыта.

В UserControl1 есть панель asp: Panel, метка asp:, содержащая asp: UpdatePanel и внутри нее кнопка asp :. В коде есть делегат и событие для его вызова - когда вы нажимаете кнопку, это событие вызывается. На странице ASPX, содержащей элемент управления UserControl, есть обработчик.

В Panel2 есть asp: UpdatePanel, asp: Panel и asp: Label

Таким образом, на странице ASPX, когда вы нажимаете кнопку в UserControl1, событие обрабатывается. Этот обработчик событий затем скрывает Panel1 и показывает Panel2. По крайней мере, это то, что ИСПОЛЬЗУЕТСЯ, чтобы произойти, но сейчас этого не происходит.

Итак, подведем итог - страница ASPX при первом посещении показывает Panel1 с UserControl1. В UserControl1 есть кнопка, пользователь нажимает на это, что вызывает событие на странице ASPX, это должно скрыть Panel1 и показать Panel2.

Если вы удалите UpdatePanels из UserControl1 и UserControl2, код сработает.

Очевидно, что наш «реальный» код здесь более сложный, но этот небольшой пример показывает, в чем проблема.

Вот почтовый индекс, содержащий проблему: http://test.wikisaber.es/testajax.zip

Ответы [ 2 ]

2 голосов
/ 10 марта 2010

Обновляется только содержимое панели обновлений. Поэтому вам нужно удалить панели обновлений с панели 1 и панели 2, а затем поместить панели 1 и панель 2 в одну и ту же панель обновления.

Редактировать: из вашего примера, если мы расширили default.aspx для включения TestUserControl1, мы получим что-то вроде:

         <asp:Panel ID="panelUC1" runat="server" Visible="false">
            <asp:Panel ID="panelUC1" runat="server">
              <div>
                <asp:Label ID="Label1" runat="server" Text="User Control 1...." />
              </div>
             <asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional">
                 <ContentTemplate>
                    <!-- only the content in from here -->
                    <div>
                      <asp:Button ID="buttonNext" runat="server" OnClick="buttonNext_Click" Text="Click" />
                   </div>  
                    <!-- to here will change when you click on buttonNext -->                       
                </ContentTemplate>
             </asp:UpdatePanel>
           </asp:Panel>
        </asp:Panel>

        <asp:Panel ID="panelUC2" runat="server" Visible="false">
            <tuc2:testUserControl2 ID="testUserControl2" runat="server" />
        </asp:Panel>

Когда вы нажимаете кнопку «Далее», страница будет отправляться назад и проходить полный жизненный цикл asp.net, однако JavaScript, управляющий панелью обновлений, будет применять только те изменения, которые были внесены в шаблон содержимого панели обновлений, которая уже сделала запрос к dom присутствует в браузере. Попробуйте сбросить текст buttonNext в событии click и посмотрите, что я пытаюсь сказать.

Я нашел эту статью http://msdn.microsoft.com/en-us/library/Bb398780(en-us,VS.90).aspx на панелях обновления и пользовательских элементах управления.

1 голос
/ 11 марта 2010

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

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

Чтобы это исправить, все, что вам нужно сделать, это добавить этот код в панель обновления:

<Triggers>
    <asp:PostBackTrigger ControlID="buttonNext" />
</Triggers>

Это заставит его сделать пост обратно и покажет вашу вторую панель.

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