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 ...

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top