Ne pouvez pas obtenir ScriptManager.RegisterStartupScript dans WebControl imbriquée dans UpdatePanel de travail
Je vais avoir ce que je crois, devrait être assez simple de problème, mais pour la vie de moi je ne vois pas mon problème. Le problème est lié à ScriptManager.RegisterStartupScript, quelque chose que j'ai utilisé de nombreuses fois avant.
Le scénario que j'ai est que j'ai un contrôle web personnalisé qui a été inséré dans une page. Le contrôle (et un ou deux autres) sont imbriquées à l'intérieur d'un UpdatePanel. Ils sont insérés dans la page sur un espace Réservé:
<asp:UpdatePanel ID="pnlAjax" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="placeholder" runat="server">
</asp:PlaceHolder>
...
protected override void OnInit(EventArgs e){
placeholder.Controls.Add(Factory.CreateControl());
base.OnInit(e);
}
C'est le seul panneau de mise à jour sur la page.
Le contrôle exige une certaine initiale javascript être exécuté pour qu'il fonctionne correctement. Le contrôle des appels:
ScriptManager.RegisterStartupScript(this, GetType(),
Guid.NewGuid().ToString(), script, true);
et j'ai aussi essayé:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
Le problème est que le script s'exécute correctement lorsque la page est affichée pour la première fois, mais de ne pas re-courir après un partiel de publication. J'ai essayé ce qui suit:
- Appel RegisterStartupScript de CreateChildControls
- Appel RegisterStartupScript de OnLoad /OnPreRender
- À l'aide de différentes combinaisons de paramètres pour les deux premiers paramètres (dans l'exemple ci-dessus, le Contrôle est la Page et est de Type GetType(), mais j'ai essayé d'utiliser le contrôle de lui-même, etc).
- J'ai essayé d'utiliser persistants et nouveaux identifiants (non pas que je crois que cela devrait avoir un impact majeur de toute façon).
- J'ai utilisé quelques points d'arrêt et ainsi de vérifier que le Registre de la ligne est appelée correctement.
La seule chose que je n'ai pas essayé est l'aide de l'UpdatePanel lui-même que le Contrôle et le Type, que je ne crois pas que le contrôle doit être conscient du panneau de mise à jour (et en tout cas, il ne semble pas être une bonne manière d'obtenir le panneau de mise à jour?).
N'importe qui peut voir ce que je fais de mal dans le ci-dessus?
Merci 🙂
Bien, pour répondre à la requête ci - dessus, il apparaît que si l'espace réservé en quelque sorte bousille le ScriptManager.RegisterStartupScript.
Quand je tire le contrôle de l'espace réservé et le code directement sur la page du Registre script fonctionne correctement (je suis également en utilisant le contrôle de lui-même comme un paramètre).
ScriptManager.RegisterStartupScript(ce, GetType(), Guid.NewGuid().ToString(), le script, true);
Quelqu'un peut jeter toute la lumière sur les raisons de l'injection de contrôle sur un espace Réservé permettrait d'éviter le ScriptManager correctement l'enregistrement du script? Je suppose que cela pourrait avoir quelque chose à voir avec le cycle de vie de contrôles dynamiques, mais apprécient (pour mes propres connaissances) si il y a une procédure à suivre pour la ci-dessus.
Vous devez vous connecter pour publier un commentaire.
Je pense que vous devriez en effet être à l'aide de la Contrôle de la surcharge de la RegisterStartupScript.
J'ai essayé le code suivant dans un contrôle serveur:
Puis dans ma page j'ai:
Où Placeholder1 est un espace réservé dans un panneau de mise à jour. L'espace réservé a un couple de d'autres contrôles, y compris les boutons.
Cela s'est comportée exactement comme vous vous en doutiez, j'ai eu une alerte disant "Bonjour" à chaque fois que j'ai chargé la page ou causé le panneau de mise à jour pour mettre à jour.
L'autre chose que vous pourriez regarder, c'est de crochet dans certains de la page du cycle de vie des événements qui sont déclenchés lors d'un panneau de mise à jour demande:
La PageRequestManager endRequestHandler événement se déclenche à chaque fois qu'un panneau de mise à jour complète de sa mise à jour - cela vous permettra d'appeler une méthode pour configurer votre contrôle.
Mon seul autre questions sont les suivantes:
J'ai eu un problème à l'aide de cette dans un contrôle utilisateur (dans une page, cela a bien fonctionné); Button1 est à l'intérieur d'un
updatepanel
, et lascriptmanager
est sur leusercontrol
.Maintenant, il semble que vous devez être prudent avec les deux premiers arguments, ils ont besoin de référencer votre page, pas votre contrôle
Lorsque vous appelez ScriptManager.RegisterStartupScript, le "Contrôle" paramètre doit être un contrôle dans un UpdatePanel qui sera mis à jour. Vous avez besoin de le modifier:
La solution est de mettre les scripts dans un dehors fichier js (permet appelé "yourDynamic.js') et ré-enregistrer de fichier chaque fois que vous actualisez l'updatepanel.
- Je utiliser le updatepanel_prerender événement:
Dans la page ou dans certains autres que vous aurez besoin de ce code javascript:
Assez cool, ah...jejeje
Cette partie de ce que j'ai posté il y a quelques temps ici.
Espérons que cette aide... 🙂
J'ai eu un problème avec la Page.ClientScript.RegisterStartUpScript - je n'étais pas à l'aide d'un panneau de mise à jour, mais le contrôle a été mis en cache. Cela signifiait que je devais insérer le script dans un Littéral (ou pourrait utiliser un espace Réservé) donc, quand rendus à partir du cache le script est inclus.
Une solution similaire pourrait fonctionner pour vous.
NE PAS Utiliser le GUID Pour les Principaux
et si vous voulez le faire , appeler quelque Chose Comme cette fonction
Ce qui a fonctionné pour moi, est de l'inscrire sur la Page tout en précisant le type que celle de l'UpdatePanel, comme suit:
Parfois il ne marche pas le feu quand le script a quelques erreur de syntaxe, assurez-vous que le script javascript et la syntaxe est correcte.
Le "vrai" param valeur à la fin de la ScriptManager.RegisterStartupScript va ajouter une balise JavaScript à l'intérieur de votre page:
Si la valeur est "faux", il va injecter uniquement le script sans le --script-- balise.
J'ai essayer beaucoup de choses et finalement trouvé que le dernier paramètre doit être faux et vous devez ajouter
<SCRIPT>
balise pour le java script :