2010-05-28 10 views
0

J'ai un usercontrol qui peut être utilisé par exemple dans un gridview itemtemplate, cela signifie que le contrôle pourrait ou ne pourrait pas être sur la page au chargement de la page. Dans le cas où le contrôle est à l'intérieur d'un itemtemplate, je ferai un popup sur le gridview via des postbacks asynchrones (via des panneaux de mise à jour).ScriptManager duplique javascript

Le contrôle contrôle lui-même les scripts scriptblocks car il dépend des javascripts. Tout d'abord je l'ai utilisé

Page.ClientScript.RegistrerClientScriptBlock 

Mais cela ne fonctionne pas sur les publications asynchrones (de UpdatePanels) donc je puis essayé la même chose en utilisant ScriptManager qui me permet de registrer des scripts sur la page après async postbacks. génial!.

ScriptManager.RegisterClientScriptBlock 

Cependant, ScriptManager (ce que je sais) n'a pas le functionallity pour voir si un script est déjà sur la page, je vais donc pour chaque postback générer des doublons des blocs de script, ce comportement est ofcourse indésirable . J'ai fait une course chez Google et j'ai découvert que je pouvais appeler la méthode Dispose() du PageRequestManager, cela fonctionne parce qu'il efface les scripts et les ajoute à nouveau (ceci résout aussi mon problème avec la suppression des inutilisés blocs de script des contrôles supprimés).

Sys.WebForms.PageRequestManager.getInstance().Dispose() 

Cependant, bien sûr, il y a un inconvénient depuis l'affichage ici :). La méthode Dispose() supprime également l'instance sur la page maître, ce qui entraîne l'arrêt des scripts qui s'exécutent après une publication asynchrone (updateprogress par exemple).

Alors, existe-t-il un moyen de vérifier si un script existe déjà sur la page en utilisant ScriptManager ou tout autre outil, ce qui m'empêchera d'insérer des scripts en double? Aussi, existe-t-il un moyen de supprimer certains blocs de script (lorsque je supprime un élément dans itemtemplate par exemple).

Merci d'avance.

Répondre

0

Si vous définissez le même type et les mêmes attributs clés lors de l'enregistrement, je pense que le SM n'en inclura qu'un seul.

+0

Hmm, il semble effectivement que vous avez raison. Quand j'ai creusé dedans j'ai réellement réalisé que j'ai utilisé la page au lieu de la commande d'usager pour enregistrer le manuscrit qui était l'erreur numéro un. Erreur numéro deux est que j'ai inclus un add_endRequest dans mon script dont l'intention était de gérer les postbacks asynchrones, mais ce n'est pas nécessaire car il semble que ScripManager fait cela pour moi, d'où les appels en double. Merci pour la réponse si :) – Andreas

1

Essayez une fonction comme celle-ci:

Public Sub AddScriptToCompositeScriptSafety(ByRef manager As ScriptManager, ByRef script As ScriptReference) 

    For Each item In manager.CompositeScript.Scripts 
     If (item.Path = script.Path) Then 
      Return 
     End If 
    Next 
    manager.CompositeScript.Scripts.Add(script) 

End Sub