Quand est la dernière en date, vous pouvez appeler Page.ClientScript.RegisterClientScriptBlock?

StackOverflow https://stackoverflow.com/questions/253267

Question

Je dois générer du code JavaScript dans un contrôle Web basé sur certains traitements et certaines propriétés que le consommateur peut définir. Le faire lors du chargement de la page sera trop tôt.

Quelle est la dernière date à laquelle je peux appeler RegisterClientScriptBlock tout en conservant sa sortie sur la page?

Était-ce utile?

La solution

OnPreRender

ou, si vous remplacez Render ... avant d'appeler "base.Render"

Autres conseils

Vieille question, mais j'ai récemment traité de cette question. Pour éclaircir un peu la réponse de Tim et éclaircir les informations erronées:

Si vous utilisez RegisterClientScriptBlock comme vous le demandez, vos scripts sont générés lors de ClientScriptManager.RenderClientScriptBlocks, appelé lors de Page.BeginFormRender - mais en réalité, il est appelé par le formulaire, et non par la page elle-même.

Voici la séquence:

  • Page.ProcessRequestMain (lorsqu'il atteint la section de rendu) appelle
  • (classe de base de la page) Control.RenderControl qui appelle
  • Control.RenderChildren qui parcourt tous les contrôles enfants et appelle éventuellement
  • HtmlForm.RenderControl qui appelle
  • HtmlForm.RenderChildren qui nous tient à coeur

Du réflecteur:

protected internal override void RenderChildren(HtmlTextWriter writer)
{
    Page page = this.Page;
    if (page != null)
    {
        page.OnFormRender();
        page.BeginFormRender(writer, this.UniqueID);
    }
    base.RenderChildren(writer);
    if (page != null)
    {
        page.EndFormRender(writer, this.UniqueID);
        page.OnFormPostRender();
    }
}

Notez les appels à page.BeginFormRender et page.EndFormRender. Entre eux, le formulaire appelle son base.RenderChildren qui appellera éventuellement la méthode Render sur votre contrôle utilisateur personnalisé. Par conséquent, pour être fidèle à votre question d'origine, vous ne pouvez pas interagir avec la partie de scripts ClientScriptBlocks à tout moment de la séquence de rendu de tout contrôle enfant, car ils ont déjà été exportés dans le flux de réponse. Vous pouvez ajouter des scripts à ce bloc lors de la séquence de rendu si vous êtes dans la méthode de rendu de la page avant d'appeler base.Render, comme le mentionne Tim, mais que cela ne fonctionne dans aucun contrôle enfant. .

Si la séquence de rendu est tout ce que vous avez à faire (c'est la situation dans laquelle je me trouve), vous pouvez utiliser ClientScript.RegisterStartupScript lors du rendu de votre contrôle, car RenderClientStartupScripts est appelé pendant page.EndFormRender, ce qui se produit après , le rendu de vos contrôles est demandé, comme vous pouvez le constater dans le code ci-dessus.

Logiquement, votre script de démarrage doit être rendu et enregistré sur la page. Par conséquent, l'événement Page_PreRender semble être un bon choix. Ensuite, le code HTML et le script de la page sont "verrouillés".

Même sur la page principale, vous pouvez l'appeler pendant PreRender. La fonction de rendu de chaque contrôle est appelée après le pré-rendu de la page principale. La fonction de rendu est donc un endroit sûr.

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