2010-03-10 2 views
0

Я постараюсь быть максимально описательным здесь. У нас есть код, который работал, и теперь, без изменения, нет. Я выделил проблему, так вот ситуация:Странная новая ошибка с ASP: панель/UserControl/UpdatePanel комбинация

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

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

В panel2 есть жерех: UpdatePanel, осина: панель и осина: Label

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

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

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

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

Вот архивный файл, содержащий вопрос: http://test.wikisaber.es/testajax.zip

ответ

1

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

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

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

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

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

+0

Спасибо Чарльз - У меня есть вопрос по этому поводу. Если UpdatePanel не обрабатывает событие как триггер, то почему в моем примере кода, когда я перехожу к нему в debug - событие DetailChanged увеличивается, и в пределах Default.aspx.cs код проходит через метод handler testUserControl1_DetailsChanged? –

2

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

Edit: Из вашего образца, если мы расширили 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> 

При нажатии на buttonNext страница будет идти и обратной передачи Повсеместно полного жизненного цикла asp.net, однако javascript, который управляет панелью обновления, применит только изменения, внесенные в contenttemplate панели обновления, которые сделали запрос в dom уже присутствующим в браузере. Попробуйте сбросить текст кнопкиNext в событии клика и посмотреть, что я пытаюсь сказать.

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

+0

Спасибо Dug, но на странице ASPX нет UpdatePanel, только в UserControls - посмотрите в примере кода. –

+0

Панель обновления позволяет выполнять частичный рендеринг страниц и отображать только изменения в содержимом отправляющей панели обновлений. Поэтому, когда я удалил панели обновления из пользовательских элементов управления в примере кода и добавил панель обновления, а пользовательские элементы управления на страницу default.aspx, она отображала текст метки во втором пользовательском элементе управления, как ожидалось. – Dug

+0

Как я уже говорил в оригинальной статье Dug: «Если вы удалите UpdatePanels из UserControl1 и UserControl2, код будет работать». Этого я знаю. Код, используемый для работы. Я ищу, чтобы узнать, почему это не так, потому что, насколько я могу судить, в коде нет ничего плохого, и он должен работать отлично, как есть. –

Смежные вопросы