Warum führt das Update-Panel einen vollständigen Beitrag für die benutzerdefinierte Steuerung durch?

Ich habe eine ziemlich komplexe benutzerdefinierte Steuerung - das benutzerdefinierte Steuerelement hat ein paar Update-Panels in ihm.

Ich versuche, das Steuerelement wie dieses in einem Update-Panel zu verwenden:

    <asp:UpdatePanel ID="up1" runat="server">
    <ContentTemplate>
     <asp:Button ID="btn1" runat="server" Text="Sample Button" />&nbsp;&nbsp;<asp:Label ID="lblTime" runat="server"></asp:Label>    
     <cc1:MyCustomControl ID="MyCustomControl1" runat="server" >
    </cc1:MyCustomControl>
    </ContentTemplate>
</asp:UpdatePanel>

Wenn ich auf die Schaltfläche im Update-Panel klicke, macht es einen asynchronen Beitrag zurück und es gibt keinen Bildschirm "Flicker" Wenn ich auf eine Schaltfläche in meinem benutzerdefinierten Steuerelement klicke, flackert die Seite und macht einen vollständigen Beitrag zurück.

Innerhalb des benutzerdefinierten Steuerelements gibt es Update-Panels, die versuchen, vollständige Postbacks durchzuführen (basierend auf Triggern).

Wie kann ich die Seitenebene UpdatePanel nicht ein vollständiges Postback machen, egal was innerhalb des benutzerdefinierten Steuerelements geht?

Antwort auf "Warum führt das Update-Panel einen vollständigen Beitrag für die benutzerdefinierte Steuerung durch? " 4 von antworten

Legen Sie im UpdatePanel die Eigenschaft ChildrenAsTriggers="true". This tells the UpdatePanel to intercept fest. Dadurch wird das UpdatePanel aufgefordert, alle PostBack-Aufrufe abzufangen, die aus dem UpdatePanel stammen.

Sie können auch die UpdateMode property, which determines what kinds of events trigger an update. (By default, an UpdatePanel will refresh if any other panel on the screen gets refreshed. This threw me for awhile until I realized what was going on.) erkunden, die bestimmt, welche Arten von Ereignissen ein Update auslösen. (Standardmäßig wird ein UpdatePanel aktualisiert, wenn ein anderes Panel auf dem Bildschirm aktualisiert wird. Das warf mich eine Weile, bis ich merkte, was vor sich ging.)

http://msdn.microsoft.com/en-us/library/bb398867.aspx#

Stellen Sie außerdem sicher, dass das ScriptManager-Steuerelement mit der Eigenschaft EnablePartialRendering auf true festgelegt ist.

Ich würde zuerst schauen, ob es ein anderes Problem mit dem benutzerdefinierten Steuerelement verursacht die ganze Seite Postback, wie in jedem Fall sollte passieren, ist, dass das gesamte Update-Panel aktualisiert (noch mit ajax).

Danach sehen Sie sich einfach den Abschnitt Nesting UpdatePanel Controls an:

Haben Sie darüber nachgedacht, explizit einen asp:AsyncPostBackTrigger mit dem btn1-Steuerelement im up1 UpdatePanel-Steuerelement festzulegen.

<asp:UpdatePanel ID="up1" runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="btn1" EventName="Click" />
    </Triggers>
    <ContentTemplate>     
        <asp:Button ID="btn1" runat="server" Text="Sample Button" />  
        <asp:Label ID="lblTime" runat="server"></asp:Label>         
        <cc1:MyCustomControl ID="MyCustomControl1" runat="server" />                 
    </ContentTemplate>
</asp:UpdatePanel>

Bearbeiten: Wie haben Sie versucht, die Update-Methode explizit im OnClick-Ereignis der Schaltfläche für den Update-Bereich aufzurufen? Dazu gehören die Update-Bedienfelder, die in das benutzerdefinierte Steuerelement eingebettet sind.

hat das Problem ähnlich ausgemacht: How can I get an UpdatePanel to intercept a CompositeControl's DropDownList

Außer meinem Steuerelement, das das Postback verursachte, befand sich in einem Updatepanel mit einem vollständigen Postback-Trigger. Ich war in der Lage, dieses Steuerelement herauszuziehen, so dass es nicht mit in Update-Panels verschachtelt war und das löste es.