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

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top