Frage

Ich habe ein ScriptControl (erfordert ScriptManager) mit JavaScript Griff clientseitige Interaktionen und ICallbackEventHandler hin und her zu kommunizieren. Alles funktioniert perfekt mit einer oder mehreren Instanzen der Steuerung auf einer Seite. Ich legte die Sonde in einem GridView mit Sortier- und es funktioniert immer noch. Allerdings habe ich die GridView in einem UpdatePanel platzieren und jetzt, wenn ich sortiere ich die folgende Fehlermeldung für jede Instanz erhalten:

Sys.InvalidOperationException: Two components with the same id 'GridView_ctl02_MyControl' can't be added to the application.

Kann jemand Punkt mich in der richtigen Richtung, wie dies zu lösen? Ich gehe davon aus ScriptManager ist nicht die alten Sys.UI.Control Objekte entsorgen, bevor Sie die neuen mit der gleichen ID $create(). Ich dachte, die UpdatePanel / ScriptManager Kombination automatisch Pflege der Entsorgung Objekte nehmen würde, die ersetzt werden würde?

Edit: Diese Seite erscheint, zu unterstützen, was ich dachte: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx

Verwenden Sie die RegisterDispose Methode registrieren dispose Skripte für Kontrollen sind, die in einem Update Steuerung. Bei der asynchronen Postbacks können Update Kontrollen sein aktualisiert, gelöscht oder erstellt. Wenn ein Panel wird aktualisiert oder gelöscht, jede dispose Skripte, die registriert sind, für Steuerelemente, die im Inneren der Update genannt werden. in typischen Seite Entwicklungsszenarien, nicht wahr haben die RegisterDispose anrufen Verfahren.

Just zu überprüfen legte ich einen alert("dispose " + this.element.id) in meiner JavaScript dispose() Funktion. Jede einzelne Instanz Warnungen dispose GridView_ctl02_MyControl, aber danach ich den Fehler, dass zwei Komponenten, die nicht den gleichen Namen GridView_ctl02_MyControl haben. Ich bin ratlos ...

War es hilfreich?

Lösung

Wenn die Seite entlädt, meine Komponente dispose() Methode aufgerufen wird und Sys.Application.removeComponent() auch genannt wird. Wenn die UpdatePanel Reloads wird nur dispose() Methode aufgerufen. Denn jetzt habe ich dieses Problem gelöst durch Sys.Application.removeComponent(this); innerhalb des dispose() setzen. Ich habe nicht eine Verknüpfung wie $ entfernen (ähnlich $ erstellen) finden, was bedeutet, Sie dies nicht oft brauchen werden erwartet.

Dies erscheint logisch, dass Sie eine Komponente halten, selbst nachdem die zugehörigen DOM-Elemente geladen (falls vorhanden) wird von der Update ersetzt. Auf diese Weise haben Sie mehr Kontrolle über die Lebensdauer der Komponente. Ich kann keinen Anwendungsfall vorstellen, aber ich bin sicher, dass Sie mit einem einfiel.

Wenn ich unterwegs bin weg, und es ist ein besserer Ansatz, lassen Sie es mich wissen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top