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:

  1. Appel RegisterStartupScript de CreateChildControls
  2. Appel RegisterStartupScript de OnLoad /OnPreRender
  3. À 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).
  4. 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).
  5. 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.

InformationsquelleAutor Chris | 2009-04-29