ScriptControl intérieur UpdatePanel
-
10-10-2019 - |
Question
I 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 de contrôle sur une page. J'ai placé le contrôle dans un GridView
avec tri et il fonctionne encore. Cependant, je place le GridView
dans un UpdatePanel
et maintenant chaque fois que je sorte que je reçois pour chaque cas l'erreur suivante:
Sys.InvalidOperationException: Two components with the same id 'GridView_ctl02_MyControl' can't be added to the application.
point que quelqu'un peut me dans la bonne direction sur la façon de résoudre ce problème? Je suppose ScriptManager
ne Jeter la Sys.UI.Control
objets avant d'essayer de $create()
les nouvelles avec le même ID. Je pensais que la combinaison UpdatePanel
/ ScriptManager
prendrait automatiquement en charge des objets qui seraient disposant être remplacés?
Modifier Cette page semble appuyer ce que je pensais: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx
Utilisation de la méthode de RegisterDispose à enregistrer des scripts pour les contrôles Dispose qui sont à l'intérieur d'un UpdatePanel contrôle. pendant asynchrone postbacks, les contrôles UpdatePanel peuvent être mis à jour, supprimé ou créé. Lorsqu'un le panneau est mis à jour ou supprimée, toute scripts qui sont enregistrés Dispose pour les contrôles qui sont à l'intérieur du UpdatePanel sont appelés. en typique page scénarios de développement, vous n'avez pas doivent appeler le RegisterDispose méthode.
Il suffit de vérifier que je mis un alert("dispose " + this.element.id)
dans ma fonction dispose()
JavaScript. Toutes les alertes instance unique dispose GridView_ctl02_MyControl
, mais après je reçois l'erreur que deux composants ne peuvent pas avoir le même nom GridView_ctl02_MyControl
. Je suis à une perte ...
La solution
Lorsque la méthode déchargements page, dispose()
de mon composant est appelé et Sys.Application.removeComponent()
est aussi appelé. Lorsque les rechargements de UpdatePanel
, seule méthode dispose()
est appelée. Pour l'instant je l'ai résolu ce problème en mettant Sys.Application.removeComponent(this);
à l'intérieur du dispose()
. Je n'ai pas trouvé un raccourci comme $ remove (similaire à $ créer), vous n'êtes pas censé impliquer besoin souvent.
Cela semble logique que vous pouvez garder un composant chargé même après ses éléments DOM connexes (le cas échéant) ont été remplacés par le 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 trouver un.
Si je suis loin et il y a une meilleure approche, s'il vous plaît laissez-moi savoir!