UpdatePanel и Repeater отображают страницу без ответа после обратной передачи

У меня есть страница с UpdatePanel, которая содержит Repeater и текстовое поле с количеством элементов в ретрансляторе. Когда я меняю значение, предполагается, что страница отправит ответ и перерисует Repeater с обновленным количеством элементов. В принципе это работает, но после обратной передачи страница зависает и не принимает никаких входных данных - только в IE 8. Он отлично работает в Firefox. Например, контекстное меню не появляется, когда я щелкаю правой кнопкой мыши в элементах управления, и я не могу вводить текст в текстовые поля.

Когда я вынимаю UpdatePanel, страница работает нормально, но, конечно же, обновляется при каждом обратном событии. Это не обязательно связано с ретранслятором на странице. Думаю, я вижу это на других страницах. В чем тут прикол?

<asp:UpdatePanel ID="uPanel" runat="server" UpdateMode="Conditional" 
  EnableViewState="true" ChildrenAsTriggers="true">
  <ContentTemplate>
  <asp:Panel ID="Panel1" runat="server" DefaultButton="btnSubmit">
    <asp:TextBox ID="tbItems" runat="server" AutoPostback="true" 
                      OnTextChanged="textchanged_Items"/>                     
  <asp:Repeater id="rptItems" runat="server" 
           OnItemDataBound="repeaterItem_Databound">
        <...>
      </asp:Repeater>


    protected void textchanged_Items(object sender, EventArgs e) {
        try {
            // this methods rebinds the repeater to a List after changing
            // the number of items in the list
            ReflowItemRepeater();   
            // This is not really necessary, since Databind() appears to
            // cause an update. I tried it anyways.               
            uPanel.Update();
        }
        catch (Exception ex) {
            ShowError(this, "Error displaying the item list.", ex, true);
        }
    }

В итоге я удалил панель обновлений.

Месяц спустя, на другой странице, я все еще и снова борюсь с этим. Ситуация такая же. Панель обновления, ретранслятор (на самом деле 2 вложенных ретранслятора) и элемент управления в ретрансляторе, который запускает событие обратной передачи. Сервер правильно обрабатывает событие и возвращает управление, но браузер (IE8) никогда не обновляет панель обновлений. Страница не отвечает, как будто в какой-то ситуации блокировки. Я могу разблокировать его, нажав кнопку, которая запускает другое событие обратной передачи (также на панели обновлений). Но текстовые поля на панели нельзя щелкнуть или изменить, когда это происходит. Кроме того, это бывает только в первый раз. Как только я «освободил» блокировку или что-то еще, это больше не повторится на этой странице, даже когда я повторю те же самые шаги, которые привели к этому.

Когда это происходит, отладчик JIT ни о чем не сообщает.


person cdonner    schedule 01.02.2010    source источник
comment
Было бы полезно, если бы вы могли предоставить тестовую страницу, чтобы мы могли увидеть это в действии.   -  person Gabriel McAdams    schedule 03.03.2010
comment
работаю над этим. выложу ссылку.   -  person cdonner    schedule 04.03.2010
comment
Итак, срок моей награды истекает, но я не вижу ответа, который был бы достоин ее присуждать. Я просто позволю этому уйти. У меня нет решения и в итоге удалил панель обновлений. По крайней мере, так работает. Я думаю, что проблема связана с тем, что различные элементы управления MS Ajax не взаимодействуют, но у меня нет времени или интереса, чтобы разобраться в проблеме.   -  person cdonner    schedule 10.03.2010


Ответы (4)


Я бы фактически установил триггеры в вашей панели обновления.

Я не уверен, что вам нужно вызывать .Update в коде позади, поскольку панель обновления будет обновляться при срабатывании триггера.

Попробуй это:

person Jack Marchetti    schedule 01.02.2010
comment
Правильно, вам не нужно явно вызывать метод Update. На самом деле он предназначен только для условного обновления (т. Е. Вы можете не захотеть обновлять панель на основе некоторых критериев). - person Jagd; 01.02.2010
comment
Ну это нормально, но не ответил на мой вопрос. - person cdonner; 01.02.2010
comment
Использование триггеров не меняет поведения. - person cdonner; 01.02.2010

Мне кажется, что это как-то связано с использованием события OnTextChanged. Если хотите, попробуйте добавить кнопку рядом с текстовым полем и вместо этого переформатируйте репитер при нажатии кнопки. IE все еще зависает?

person Cory Grimster    schedule 03.03.2010

Поэтому я сократил эту страницу до минимума и выяснил, что это делает - AjaxToolkit: CalendarExtender. Если вынуть, все работает нормально. Тем не менее, мне было бы любопытно узнать, есть ли обходной путь.

Вот ссылка на мою тестовую страницу. Я буду так держать несколько дней.

Чтобы увидеть проблему, выберите «2» в раскрывающемся списке, затем введите что-нибудь в первое поле количества и закройте вкладку. Курсор будет мигать в следующем поле, но ввод не разрешен. Это произошло в IE8, а не в Firefox.

Изменить: на самом деле, когда я вернулся на полную страницу и удалил CalendarExtender, он все еще не работал. Я подозреваю, что эта проблема связана с отправкой элементов управления обратно в UpdatePanel, но я просто не могу ее определить. Кажется, это одна из тех вещей, когда комбинация x вещей не работает, в то время как любая комбинация (x-1) вещей работает.

person cdonner    schedule 04.03.2010

Что касается первоначального вопроса, вот рабочий образец. Не знаю, поможет ли это, но на всякий случай ...

<%@ Page Language="C#" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server"><title>Ajax Test</title></head>
  <body>
    <form id="form1" runat="server">
<asp:ScriptManager runat="server" />

<asp:UpdatePanel runat="server" ChildrenAsTriggers="true">
  <ContentTemplate>
    <asp:Label runat="server" AssociatedControlID="txtTest">
       Enter 'fruit' or 'vegetables':
    </asp:Label>
    <asp:TextBox
      runat="server" ID="txtTest" AutoPostBack="true"
      OnTextChanged="Handler_Test_TextChanged"
    />

    <asp:Repeater runat="server" ID="rptItems">
      <HeaderTemplate><ul></HeaderTemplate>
      <ItemTemplate><li><%# Container.DataItem.ToString() %></li></ItemTemplate>
      <FooterTemplate></ul></FooterTemplate>
    </asp:Repeater>
  </ContentTemplate>
</asp:UpdatePanel>
    </form>
  </body>
</html>

<script runat="server">
  static readonly string[] Fruit = new string[]
    { "Apples", "Oranges", "Bananas", "Pears" };

  static readonly string[] Veg = new string[]
    { "Potatoes", "Carrots", "Tomatoes", "Onion" };

  void Handler_Test_TextChanged(object s, EventArgs e)
  {
    if(txtTest.Text == "fruit")            rptItems.DataSource = Fruit;
    else if(txtTest.Text == "vegetables")  rptItems.DataSource = Veg;
    else                                   return;
    rptItems.DataBind();
  }
</script>
person Kerido    schedule 09.03.2010