9
votes

Pourquoi ne pouvez-vous pas faire signe d'inscrire?

me semble que c'est un peu bizarre que vous pouvez faire ..

Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true);


3 commentaires

Juste à l'esprit, pourquoi voudriez-vous désenregistrer un script?


@Ian: Parce que si vous allez sur une autre page Web et revenez à nouveau à l'aide de l'option Back du navigateur, le script redevient à nouveau!


@Iankemp dans mon cas, c'était parce que je devais lancer une popup, mais seulement après la survenue du post-plan. Consultez ma réponse, tandis que tout ce problème est un kludge, c'était de loin le moins kludgy.


4 Réponses :


5
votes

Je suppose que vous voudriez "désenregistrer" le script (qui a déjà été enregistré) sous une condition, comme: xxx

Pourquoi cela ne peut-il pas simplement être changé en : xxx


2 commentaires

Vous avez raison au lieu de résoudre le code odeur avec refactoring, je cherchais une solution plus rapide .. méchant!


Si seulement elle était aussi délibérée que de vous protéger de l'appel de l'enregistrement trop tard. C'est en fait sans danger jusqu'à la stade de rendu, mais inscristarstartupscript est assez heureux d'être appelé après le rendu quand il est trop tard pour inclure le script de la réponse.



10
votes

C'est en fait pire que vous ne le pensez - "simplement en l'enregistrant et que cela ne fait rien" n'est pas une option non plus. La méthode de registre vérifie si un script est déjà enregistré avec cette clé et ne fait rien si c'est. Une fois que vous avez appelé enregistrezStartupscript , rien que vous puissiez faire pour arrêter ce script étant rendu.

Pourquoi Microsoft a-t-il fait cela, je suppose que la possibilité de modifier ou de supprimer des scripts enregistrés a été simplement oubliée lorsque enregistrementStartupscript a été conçu pour la première fois. Les choix de conception se sont déroulés non triviaux de revenir en arrière et de créer une méthode sans engagement, ils auraient donc besoin d'une bonne raison de le faire.

Lorsque vous enregistrez un script, il est stocké à deux endroits au sein de ClientcriptManager. Un listdictionnaire permet de vérifier si un script est déjà enregistré et une arracheListe stocke les scripts réels tels qu'ils seront rendus. Je suppose que le tableau est utilisé pour garantir que les scripts sont rendus dans l'ordre dans lequel ils ont été enregistrés, mais cela signifie également que vous ne pouvez pas indiquer quelle chaîne dans la flambée appartient à quelle clé.

Il ne serait pas difficile d'équiper votre propre classe de page avec des méthodes de maybeaddstartupscript (touche, script) et modifiMMIndaboutThatStartupscript (touche) . Enregistrez les clés et les scripts de votre propre dictionnaire, puis dans le prélendeur, enregistrez-vous quel que soit les scripts l'ont rendu aussi loin. C'est certainement ennuyeux de devoir le faire vous-même, cependant.


2 commentaires

Le point clé que j'ai pris à partir de cette réponse était d'enregistrer des scripts dans Pre_Render plutôt que de vous inscrire à la page_load, puis de tenter de ré-enregistrer en fonction d'un événement sur la page.


@Brianhinchey Je suis d'accord, et bien que ma réponse ici n'utilise pas le préliminaire, cela aide à comprendre ce qui se passe dans les coulisses. Jetez un coup d'œil et dites-moi si vous aimez ma solution.



2
votes

Après de nombreuses études, j'ai trouvé une solution au problème si vous souhaitez exécuter uniquement le script enregistré une fois basé sur un événement. Spécial grâce à la réponse de @ Stevemegson ici qui m'a aidé à comprendre ce que le problème était réellement.

La solution implique le sys.application.add_ad_load et retirer_load méthodes javascript.

Cela fonctionne comme ceci. Une fonction JavaScript générique qui appelle d'abord la fonction de travailleur, puis se supprime est la première instruction, puis add_load le suit en appelant cette fonction: xxx

Ceci est basé sur un Solution Telerik . Il fait référence à Telerik Controls, mais toutes les fonctionnalités sont ASP.NET.


2 commentaires

Cela fait toujours fonctionner le script sur la post-retour pour moi


@Jameswierzba Sauf si vous mettez cela dans la charge de la page, cela s'exécutera, puis déchargez immédiatement cette méthode. Peut-être que vous pourriez dupliquer votre problème sur un violon?



0
votes

Comment puis-je Ecraser une fonction JavaScript ajoutée (dynamiquement) par ASP.NET UPDOYPANELL?

Je pense qu'un utilisateur UpdatePanel est une solution pour écraser JS. Lorsque nous utilisons un panneau de mise à jour, un JavaScript n'est pas exécuté sur le dos partiel et doit être enregistré par code: xxx

si nous ne le faisons pas, nous pouvons alors enregistrer / rendu une fonction modifiée Encore une fois sur le dos partiel dans le panneau de mise à jour. Dans ce cas, il y a un problème de fonction de fonction.

Désolé pour mon anglais.


0 commentaires