2010-02-01 3 views
1

J'ai une page avec un UpdatePanel qui contient un répéteur et une zone de texte avec le nombre d'éléments dans le répéteur. Lorsque je change la valeur, la page est censée publier et redessiner le répéteur avec le nombre d'éléments mis à jour. Cela fonctionne en principe, mais la page finit gelé après les post-retours et n'accepte aucune entrée - dans IE 8 seulement. Cela fonctionne parfaitement bien dans Firefox. Par exemple, le menu contextuel n'apparaît pas lorsque je clique avec le bouton droit de la souris sur les contrôles et que je ne peux pas entrer de texte dans les zones de texte.La page de rendu UpdatePanel et Repeater ne répond pas après le post-retour

Lorsque je supprime le UpdatePanel, la page fonctionne correctement, mais elle s'actualise bien sûr à chaque événement post-retour. Ce n'est pas nécessairement lié au répéteur sur la page. Je pense que je vois cela sur d'autres pages. Quel est le truc ici?

<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); 
     } 
    } 

J'ai fini par supprimer le panneau de mise à jour.

Un mois plus tard, une page différente, je me bats encore et encore. La situation est la même. Un panneau de mise à jour, un répéteur (en réalité 2 répéteurs imbriqués) et un contrôle dans le répéteur qui déclenche un événement de publication. Le serveur traite l'événement correctement et renvoie le contrôle, mais le navigateur (IE8) n'actualise jamais le panneau de mise à jour. La page ne répond pas, comme si elle était dans une situation de blocage. Je peux le déverrouiller en cliquant sur un bouton qui déclenche un autre événement de publication (également dans le panneau de mise à jour). Mais les zones de texte dans le panneau ne sont pas cliquables ou modifiables lorsque cela se produit. En outre, il arrive seulement la première fois. Une fois que j'ai "libéré" le verrou, ou quoi que ce soit, cela ne se reproduira plus sur cette page, même si je répète exactement les mêmes étapes qui l'ont conduit.

Lorsque cela se produit, le débogueur JIT ne signale rien.

+0

Il serait utile si vous pouviez fournir une page de test afin que nous puissions voir cela en action. –

+0

travaillant dessus. affichera un lien. – cdonner

+0

Erreur se produit dans IE7 ainsi –

Répondre

1

Je définirais réellement des déclencheurs dans votre panneau de mise à jour.

Je ne suis pas sûr que vous avez besoin d'appeler .Update dans votre code, car le panneau de mise à jour sera mis à jour lorsque le déclencheur se produit.

Essayez ceci:

+0

Correct, vous ne devriez pas avoir besoin d'appeler explicitement la méthode Update. Il est uniquement destiné à la mise à jour conditionnelle (par exemple, il se peut que vous ne souhaitiez pas mettre à jour le panneau en fonction de certains critères). – Jagd

+0

D'où mon engagement dans le code. – cdonner

+0

Eh bien, c'est bien, mais ne répond pas à ma question. – cdonner

0

Mon sentiment profond est qu'il a quelque chose à voir avec l'utilisation de l'événement OnTextChanged. Pour les coups de pied, essayez d'ajouter un bouton à côté de la zone de texte, et refaites le répéteur lorsque le bouton est cliqué à la place. Est-ce que IE gèle encore?

0

J'ai donc réduit cette page au minimum et j'ai découvert ce qui se passe: AjaxToolkit: CalendarExtender. Si je le sors, tout va bien. Pourtant, je serais curieux de savoir s'il existe une solution de contournement. Il s'agit d'un link to my test page. Je vais le garder pendant quelques jours.

Pour voir le problème, sélectionnez "2" dans la liste déroulante, puis tapez quelque chose dans le premier champ de quantité et tabulation. Le curseur clignote dans le champ suivant, mais il ne permet pas d'entrée. Cela s'est passé dans IE8, pas dans Firefox. Edit: En fait, lorsque je suis revenu à la page complète et que j'ai supprimé CalendarExtender, il ne fonctionnait toujours pas. Je soupçonne que ce problème a à voir avec les contrôles postés dans le UpdatePanel, mais je ne peux tout simplement pas l'épingler. Il semble que ce soit une de ces choses où une combinaison de x choses ne fonctionne pas, alors que n'importe quelle combinaison de (x-1) choses fonctionne.

0

En ce qui concerne la question initiale, voici un exemple de travail.Je ne sais pas si c'est tout à fait utile, mais juste pour être sûr ...

<%@ 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> 
Questions connexes