2010-10-21 4 views
1

J'ai un ScriptControl (nécessite ScriptManager) avec JavaScript pour gérer les interactions côté client et ICallbackEventHandler pour communiquer dans les deux sens. Tout fonctionne parfaitement avec une ou plusieurs instances du contrôle sur une page. J'ai placé le contrôle à l'intérieur d'un GridView avec le tri et cela fonctionne toujours. Cependant, je place le GridView dans un UpdatePanel et maintenant chaque fois que je sorte, je reçois l'erreur suivante pour chaque instance:ScriptControl inside UpdatePanel

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

me point que quelqu'un peut dans la bonne direction sur la façon de résoudre ce problème? Je suppose que ScriptManager ne se débarrasse pas des anciens objets Sys.UI.Control avant d'essayer de $create() les nouveaux avec le même ID. Je pensais que la combinaison UpdatePanel/ScriptManager prendrait automatiquement soin d'éliminer les objets qui seraient remplacés?

Edit: Cette page semble appuyer ce que je pensais: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx

Utilisez la méthode RegisterDispose pour registre disposer des scripts pour les contrôles qui sont à l'intérieur d'un contrôle UpdatePanel . Au cours des publications asynchrones , les contrôles UpdatePanel peuvent être mis à jour, supprimés ou créés. Lorsqu'un panneau est mis à jour ou supprimé, tous les scripts d'élimination qui sont enregistrés pour les contrôles qui se trouvent dans le UpdatePanel sont appelés. Dans les scénarios de développement de page typiques, vous ne devez pas appeler la méthode RegisterDispose .

Juste pour vérifier que je placé un alert("dispose " + this.element.id) dans ma fonction JavaScript dispose(). Chaque instance unique alerte dispose GridView_ctl02_MyControl, mais après j'obtiens l'erreur que deux composants ne peuvent pas avoir le même nom GridView_ctl02_MyControl. Je suis à perte ...

Répondre

1

Lorsque la page est déchargée, la méthode dispose() de mon composant est appelée et Sys.Application.removeComponent() est également appelée. Lorsque le UpdatePanel recharge, seule la méthode dispose() est appelée. Pour l'instant, j'ai résolu ce problème en mettant Sys.Application.removeComponent(this); à l'intérieur du dispose(). Je n'ai pas trouvé de raccourci comme $ remove (similaire à $ create), ce qui implique que vous ne devriez pas en avoir souvent besoin.

Cela semble logique dans la mesure où vous pouvez conserver un composant chargé même après que ses éléments DOM associés (le cas échéant) ont été remplacés par UpdatePanel. De cette façon, vous avez plus de contrôle sur la vie du composant. Je ne peux pas imaginer un cas d'utilisation, mais je suis sûr que vous pourriez en trouver un.

Si je suis loin et qu'il y a une meilleure approche, s'il vous plaît faites le moi savoir!