Pregunta

Tengo un ScriptControl (requiere ScriptManager) con JavaScript para manejar las interacciones del lado del cliente y ICallbackEventHandler para comunicarse de ida y vuelta. Todo funciona perfectamente con una o varias instancias del control en una página. Coloqué el control dentro de un GridView con la clasificación y todavía funciona. Sin embargo, coloco la GridView en un UpdatePanel y ahora cada vez que una especie me sale el siguiente error para cada instancia:

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

Me puede alguien punto en la dirección correcta en la forma de resolver esto? Estoy asumiendo ScriptManager no está disponiendo de los objetos antiguos Sys.UI.Control antes de tratar de $create() los nuevos con el mismo ID. Pensé que la combinación UpdatePanel / ScriptManager tomaría automáticamente de objetos de disposición que serían reemplazados?

Editar Esta página parece apoyar lo que pensaba: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx

Usar el método RegisterDispose a Desechar registrar secuencias de comandos para los controles que están dentro de un UpdatePanel controlar. durante asíncrono devoluciones de datos, controles UpdatePanel pueden ser actualizado, eliminado o creados. Cuando una panel se actualiza o se elimina, cualquier Desechar los scripts que están registrados para controles que están dentro de la UpdatePanel son llamados. en típica página escenarios de desarrollo, no lo hace tiene que llamar a la RegisterDispose método.

Sólo para comprobarlo me colocó un alert("dispose " + this.element.id) dentro de mi función dispose() JavaScript. Cada alertas de instancia única dispose GridView_ctl02_MyControl, pero después me sale el error que dos componentes no pueden tener el mismo nombre GridView_ctl02_MyControl. Estoy en una pérdida ...

¿Fue útil?

Solución

Cuando se descargue la página, método dispose() de mi componente se llama y Sys.Application.removeComponent() también se le conoce. Cuando las recargas UpdatePanel, se llama único método dispose(). Por ahora he resuelto esto poniendo Sys.Application.removeComponent(this); dentro del dispose(). No he encontrado un atajo como $ remove (similar a crear $), lo que implica que no se espera que necesite esta frecuencia.

Esto parece lógico en que se puede mantener un componente cargado incluso después de sus elementos DOM relacionados (si los hay) han sido reemplazados por el UpdatePanel. De esta manera usted tiene más control sobre la vida del componente. No me puedo imaginar un caso de uso, pero estoy seguro de que podría llegar a uno.

Si estoy lejos y no hay un mejor enfoque, por favor hágamelo saber!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top