web-dev-qa-db-de.com

Vollständiger Postback, ausgelöst durch LinkButton in GridView in UpdatePanel

Ich habe eine GridView in einem UpdatePanel. In einem Vorlagenfeld befindet sich eine Schaltfläche, die ich zum Markieren von Elementen verwende. Funktionell funktioniert das einwandfrei, aber die Schaltfläche löst immer ein vollständiges Postback statt eines partiellen Postbacks aus. Wie bekomme ich die Schaltfläche zum Auslösen eines partiellen Postbacks?

<asp:ScriptManager ID="ContentScriptManager" runat="server" />
<asp:UpdatePanel ID="ContentUpdatePanel" runat="server" ChildrenAsTriggers="true">
    <ContentTemplate>
        <asp:GridView ID="OrderGrid" runat="server" AllowPaging="false" AllowSorting="false"
            AutoGenerateColumns="false">
            <Columns>
                <asp:TemplateField HeaderText="">
                    <ItemTemplate>
                        <asp:LinkButton ID="MarkAsCompleteButton" runat="server" Text="MarkAsComplete"
                            CommandName="MarkAsComplete" CommandArgument='<%# Eval("Id") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="Name" HeaderText="Name" />
                <asp:BoundField DataField="LoadDate" HeaderText="Load Date" />
                <asp:BoundField DataField="EmployeeCutOffDate" HeaderText="Cut Off Date" />
                <asp:BoundField DataField="IsComplete" HeaderText="Is Completed" />
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>
38
Kevin Albrecht

Sie müssen jeden LinkButton als AsyncPostBackTrigger registrieren. Nachdem jede Zeile in Ihrer GridView gebunden ist, müssen Sie nach dem LinkButton suchen und ihn wie folgt mit Code-Behind registrieren:

protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e)  
{  
   LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton;  
   ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb);  
}  

Dies erfordert auch, dass ClientIDMode="AutoID" für den LinkButton gesetzt ist, wie hier (Dank an Răzvan Panda für den Hinweis).

75
NakedBrunch

Dies wird wahrscheinlich nicht empfohlen, aber Sie können alles in der GridView asynchron ausführen, indem Sie EventName auf dem AsyncPostBackTrigger ausschließen, z.

<Triggers>
  <asp:AsyncPostBackTrigger ControlID="OrderGrid" />
</Triggers>

Dadurch werden das RowCommand-Ereignis und alle anderen Ereignisse in der GridView asynchron ausgelöst. Beachten Sie auch, dass wenn Sie ClientIDMode = "Static" in der GridView festlegen, dies ein vollständiges Postback verursacht.

5
Ewert

Meine Rasteransicht befindet sich im bedingten Modus.

protected void gvAgendamentoExclui_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow) {
            LinkButton lnk = e.Row.FindControl("LinkButton2") as LinkButton;
            AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
            trigger.ControlID = lnk.UniqueID;
            trigger.EventName = "Click";
            UpdatePanel2.Triggers.Add(trigger);

        }
    }

Und in das Click-Event des Linkbuttons stecke ich:

protected void LinkButton2_Click(object sender, EventArgs e)
    {
        UpdatePanel2.Update();
    }
4
sahar

MSDN gibt an, dass die UpdatePanel.ChildrenAsTriggers-Eigenschaft "[g] einen Wert festlegt, der angibt, ob Postbacks von untergeordneten Steuerelementen eines UpdatePanel-Steuerelements den Inhalt des Panels aktualisieren" (siehe http://msdn.Microsoft.com/en- us/library/system.web.ui.updatepanel.childrenastriggers.aspx ).

Da es sich bei Ihrem LinkButton nicht um ein "unmittelbares untergeordnetes Steuerelement" handelt, empfiehlt es sich, das LinkButton als expliziten AsyncPostBackTrigger zu konfigurieren.

Fügen Sie unterhalb Ihres </ ContentTemplate> -Tags Folgendes hinzu:

<Triggers>
  <asp:AsyncPostBackTrigger ControlID="MarkAsCompleteButton" EventName="Click" />
</Triggers>
1
Matthew Rodatus

Füge das folgende Element in das system.web -Element in die Datei web.config ein

<xhtmlConformance mode="Transitional"/>
1
Sukhjeevan

Ich hatte ein Problem, bei dem ich ein Formular hatte, das gut funktionierte (page1), ein anderes, das ganze Postbacks (page2) ausführte. Wie sich herausstellte, als ich die zweite Seite erstellte, hatte ich etwas zu viel cut/paste gemacht, und es gab immer noch einen javascript-Aufruf in der Formulardefinition. 

< form id="form1" runat="server" onsubmit="return checkstuff();">

checkstuff wurde jedoch nicht in page 2 definiert.

löschte die Variable onsubmit und die Teilpostings funktionierten. 

Auf der Arbeitsseite - Seite 1 wurde checkstuff definiert, es handelt sich jedoch lediglich um einen Stub, der nichts anderes als true zurückgab. Nur zum Grinsen stelle ich eine Warnung in checkstuff vor, und wirklich, es wird für alle Einsendungen aufgerufen, ob teilweise oder nicht. Und wenn ich den Stub geändert habe, um einfach falsch zurückzukehren, ist überhaupt nichts passiert.

Wir weisen darauf hin, dass das Javascript immer noch verwendet wird, als ob eine vollständige Seite gesendet wird. Überprüfen Sie also Ihre clientseitigen Skripts.

0
mike

dies mag alt sein, aber meine Lösung bestand darin, ein Aktualisierungsfenster in das itemTemplate und eines außerhalb des gridview-Fensters einzufügen.

der Auslöser sollte die Rasteransicht sein und der äußere Auslöser sollte die Rasteransicht und PageIndexChanging sein. Versuch das.

0
user4014903