UpdatePanel и Repeater делают страницу не отвечающей после постбека - PullRequest
1 голос
/ 01 февраля 2010

У меня есть страница с UpdatePanel, которая содержит повторитель и текстовое поле с количеством элементов в повторителе.Когда я изменяю значение, страница должна отправлять обратно и перерисовывать репитер с обновленным количеством элементов.Это работает в принципе, но страница заканчивается после постбэков и не принимает никакого ввода - только в 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 ничего не сообщает.

Ответы [ 4 ]

1 голос
/ 01 февраля 2010

Я бы на самом деле установил триггеры в вашей панели обновлений.

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

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

0 голосов
/ 10 марта 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>
0 голосов
/ 04 марта 2010

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

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

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

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

0 голосов
/ 03 марта 2010

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

...