ScriptControl all'interno UpdatePanel
-
10-10-2019 - |
Domanda
Ho un ScriptControl
(richiede ScriptManager
) con JavaScript per gestire le interazioni lato client e ICallbackEventHandler
per comunicare avanti e indietro. Tutto funziona perfettamente con una o più istanze del controllo in una pagina. Ho messo il controllo all'interno di un GridView
con l'ordinamento e funziona ancora. Tuttavia, ho posto il GridView
in un UpdatePanel
e ora ogni volta che mi sorta ricevo il seguente errore per ogni istanza:
Sys.InvalidOperationException: Two components with the same id 'GridView_ctl02_MyControl' can't be added to the application.
Qualcuno può punto nella giusta direzione su di me come risolvere questo? Io parto dal presupposto ScriptManager
non è lo smaltimento di vecchi oggetti Sys.UI.Control
prima di tentare di $create()
quelli nuovi con lo stesso ID. Ho pensato che la combinazione UpdatePanel
/ ScriptManager
prenderebbe automaticamente la cura degli oggetti di disposizione che sarebbe stato sostituito?
Modifica Questa pagina viene visualizzata per sostenere quello che ho pensato: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx
Utilizzare il metodo RegisterDispose a registrare script Dispose per i controlli che sono all'interno di un UpdatePanel controllo. durante asincrono postback, i controlli possono essere UpdatePanel aggiornate, eliminate o creati. Quando un pannello viene aggiornato o eliminato, qualsiasi script Dispose che sono registrati per i controlli che sono all'interno UpdatePanel sono chiamati. in tipico pagina scenari di sviluppo, non è necessario chiamare la RegisterDispose metodo.
Solo per doppio controllo ho messo un alert("dispose " + this.element.id)
dentro la mia funzione di dispose()
JavaScript. Ogni singolo avvisi istanza dispose GridView_ctl02_MyControl
, ma in seguito ho l'errore che due componenti non possono avere lo stesso nome GridView_ctl02_MyControl
. Sono ad una perdita ...
Soluzione
Quando le singole discariche di pagina, il metodo dispose()
di mia componente si chiama e Sys.Application.removeComponent()
è anche chiamato. Quando la ricarica UpdatePanel
, unico metodo dispose()
viene chiamato. Per ora ho risolto questo mettendo Sys.Application.removeComponent(this);
all'interno del dispose()
. Non ho trovato una scorciatoia ad esempio $ remove (simile a $ creare), il che implica che non sono tenuti a bisogno di questo spesso.
Questo sembra logico in quanto è possibile mantenere un componente caricato anche dopo i suoi elementi DOM correlati (se presenti) sono stati sostituiti dal UpdatePanel. In questo modo si ha più controllo sulla vita del componente. Non riesco a immaginare un caso d'uso, ma sono sicuro che si potrebbe trovare con uno.
Se io sono lontano e non v'è un approccio migliore, per favore fatemelo sapere!