2010-11-30 9 views
8

Ich habe in, was ein sehr berühmtes Problem scheint: Mein Updatepanel feuert eine vollständige Postback statt einer asynchronen Postback. Die normale Lösung ist es, alle Kontrollen geben Sie fügen dynamisch eine ID, die ich getan habe, aber ich habe noch ein volles Postbacks statt meinen asynchronen Postbacks bekommen ...Updatepanel gibt vollen Postback anstelle von asyncpostback

Hier ist der Code:

HTML:

<asp:UpdatePanel ID="ItemsUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False"> 
    <Triggers> 
    </Triggers>  
    <ContentTemplate> 
    <asp:ListView ID="PlayerItems" runat="server" GroupItemCount="5" 
            onitemdatabound="PlayerItems_ItemDataBound"> 
    <LayoutTemplate> 

    ... Listview stuff ... 

    </asp:ListView> 

    </ContentTemplate> 
</asp:UpdatePanel> 

der interessante Teil ist der C# -Code hinter (Methode PlayerItems_ItemDataBound), die wie folgt lautet:

  ImageButton imgBtn = new ImageButton(); 
      imgBtn.ID = "itemBtn"; 
      imgBtn.Width = Unit.Pixel(30); 
      imgBtn.ImageUrl = "~/Images/Game/Items/" + myItem.ItemImageUrl; 

      ContextMenu menu = new ContextMenu(); 
      menu.BoundControls.Add(imgBtn); 
      menu.ItemCommand += new CommandEventHandler(menu_ItemCommand); 

      menu.AutoHide = true; 
      menu.RolloverColor = Color.Gray; 
      menu.ID = "MenuMenu"; 

      Panel panel = (Panel)(e.Item.FindControl("ItemPanel")); 
      panel.Controls.Add(imgBtn); 
      panel.Controls.Add(menu); 

      AsyncPostBackTrigger trig = new AsyncPostBackTrigger(); 
      trig.ControlID = menu.UniqueID; 
      trig.EventName = "ItemCommand"; 
      ItemsUpdatePanel.Triggers.Add(trig); 

Also, ich eine AsyncPostBackTr tatsächlich hinzufügen Klicken Sie auf das Menü, damit das ItemCommand-Ereignis registriert werden soll. Was passiert, wenn ich auf einen Eintrag in diesem Kontextmenu klicke, ist ein voller Postback passiert.

Ich habe versucht, mit der ChildrenAsTriggers Eigenschaft ohne Hilfe zu spielen. Ich habe den AsyncPostBackTrigger-Code auch ohne Hilfe nach oben und unten verschoben.

Vielen Dank im Voraus ..! Lars

Antwort

8

Von der AsyncPostBackTrigger Dokumentation:

Programmatically Zugabe AsyncPostBackTrigger Kontrollen ist nicht unterstützt. Um programmgesteuert ein Postback-Steuerelement registrieren, verwenden Sie die RegisterAsyncPostBackControl Methode von die ScriptManager Kontrolle. Dann rufen Sie die Update Methode der UpdatePanel Kontrolle, wenn die Steuerung zurückgibt.

+0

Urh .. Nicht, was ich gehofft hatte .. Aber so ist es gemacht! Vielen Dank! Ich bin wirklich dankbar! :-) –

+0

Großartige Informationen! =) –

+0

Vielen Dank dafür, mich selbst zu treten! UpdatePanel1.Update(); – GPMorgan

29

Ich hatte die gleiche Erfahrung beim Auffüllen einer CheckBoxList innerhalb einer ListView in einem Panel in einem UpdatePanel. Es wurde gelöst, indem dieser Code in der CheckBoxList hinzugefügt wurde:

ClientIDMode="AutoID" 
+5

Das funktioniert! Ich danke dir sehr. MS hat geändert, wie ClientIDs in .net 4.0 von "AutoID" zu "Predictable" generiert werden, und ich denke, der ScriptManager oder UpdatePanel wurde nicht korrekt aktualisiert, um es zu verwenden. Ich kann keine Dokumentation darüber finden, warum das irgendwo ist oder ob es vom Design her so belassen wurde. – MikeTeeVee

+2

GROSSE ANTWORT !!! Vielen Dank !! – billy

+3

Epische Antwort, so einfach. Vielen Dank! –