Löschen von ASP.NET Repeater Artikel - fehlerhafte löschen...?
Habe ich einen repeater, die bindet einen Satz von Daten. Innerhalb dieser repeater ist eine Spalte mit verschiedenen Steuerelementen für die Aktualisierung, das löschen, etc. Dies sind die Bild-Tasten, die Feuer ein onclick-Ereignis wie "DeleteRecord". Alle diese tut, ist Feuer eine gespeicherte Prozedur auf und übergibt die ID des Datensatzes zu löschen von der CommandArgument des Objekts.
Dieses funktioniert wunderbar... bis auf ein ziemlich großes problem. Sobald Sie einen Datensatz löschen, wenn Sie die Seite aktualisieren, wird der Datensatz, in dem die ersten gelöschten Datensatz verwendet werden, gelöscht wird.
Zum Beispiel... wenn ich 4 Datensätze
1 Record1 2 Record2 3 Record3 4 Record4
und ich lösche Datensatz 2... Die Seite wird neu geladen (die ist gut):
1 Record1 3 Record3 4 Record4
...wenn ich dann auf aktualisieren...
1 Record1 4 Record4
Ich nehme an, dies ist, weil die fälschlicherweise gelöschte Objekt (record3) ist jetzt in der gleichen hierarchischen Stelle wie die alte-Objekt verwendet werden, und .net also weiß nicht der Unterschied, die Seite wird aktualisiert und feuert die onlick-event, packte den Befehl argument, die neues Objekt und löscht basierend auf der ID erhalten Sie aus der commandargument des neuen Objekts.
Dies ist natürlich ein riesiges problem, wenn ein client hast, dies würde es zerstören, Daten irrtümlich und ich bin ratlos hier.
Gibt es eine Möglichkeit, um dies zu verhindern? Ich bin mir nicht sicher, ob es einen besseren Weg, Dinge zu tun oder nicht. Wenn es nicht ist, ich brauche irgendeine Art und Weise zu sagen, die Seite nicht zur Ausführung der Veranstaltung oder auf cross-Referenz die ID des Objekts, das ist soll für die Löschung gegen das Objekt selbst...
Code unten für die Bequemlichkeit...
BEARBEITEN Wickelte einen LinkButton um ihn herum, weil ich einige jquery-code hier auch die Haltestellen der Seite der Ausführung zu warten, für die Bestätigung des Benutzers. Drücken von "ok" fährt der Seite der Ausführung.
<asp:LinkButton ID="oDeleteLink" CssClass="oDeleteIcon" CommandName="Delete" CommandArgument='<%# Eval("iAccountID") %>' runat="server">
<asp:ImageButton ImageUrl="/files/system/icons/trash-steel-16.png" ToolTip="Delete This Account" AlternateText="Delete" ID="oDeleteIcon" runat="server" />
</asp:LinkButton>
protected void oAccounts_ItemCommand(Object Sender, RepeaterCommandEventArgs e) {
if (e.CommandName == "Delete") {
int ID = e.CommandArgument.ToString().Numeric();
db.SPs.SpDeleteAccount(ID).Execute();
UI.Confirm(uiBroadcast, "Account has been deleted", "300px");
BindAccounts();
}
}
Würde schätzen jedes feedback Euch Leute geben konnte.
- Vielen Dank für die Bearbeitung, Oded.
- Ich habe versucht Adam, die Lösung, und es tut die gleiche Sache. Ich sollte jedoch darauf hingewiesen werden, dass musste ich etwas improvisieren, aber es sollte nicht machen einen Unterschied in der Ausführung von code. Ich werde aktualisieren Sie den code oben entsprechend der neuen situation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden ItemCommand-Ereignis und CommandName/CommandArgument statt:
Und die event-handler:
Diese Weise die löschen-Taste selbst ist, die anzeigt, welche ID zu löschen, im Gegensatz zu unter Berufung auf positionelle Elemente in Ihrem repeater.
Müssen Sie den Post-Redirect-Get-pattern [1]
Grundsätzlich zeigen die Daten, nehmen Sie den Befehl Anfrage und leiten Sie zurück zur Anzeige der Daten, zeigen nicht die Aktualisierung in Reaktion auf die post. Jede Aktualisierung wird erneut anfordern der Daten nicht re-führen Sie die post
adam
[1] http://en.wikipedia.org/wiki/Post/Redirect/Get