UpdatePanel и Repeater изобразяват страницата да не реагира след обратно публикуване

Имам страница с 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 дебъгерът не отчита нищо.


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