Quando è l'ultimo in assoluto che puoi chiamare Page.ClientScript.RegisterClientScriptBlock?

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

Domanda

Devo generare un po 'di JavaScript in un WebControl basato su alcune elaborazioni e su alcune proprietà che il consumatore può impostare, farlo sul caricamento della pagina sarà troppo presto.

Quando è l'ultimo che posso chiamare RegisterClientScriptBlock e ancora l'output sulla pagina?

È stato utile?

Soluzione

OnPreRender

oppure, se si esegue l'override di Render .... prima di chiamare " base.Render "

Altri suggerimenti

Vecchia domanda, ma di recente mi sono occupato di questo, quindi per dare un po 'più di chiarimento alla risposta di Tim e chiarire un po' di disinformazione:

Se usi RegisterClientScriptBlock come stai chiedendo, i tuoi script verranno emessi durante ClientScriptManager.RenderClientScriptBlocks, che viene chiamato durante Page.BeginFormRender - ma in realtà viene chiamato dal Modulo, non dalla Pagina stessa.

Ecco la sequenza:

  • Page.ProcessRequestMain (quando raggiunge la sezione di rendering) chiama
  • (classe base della pagina) Control.RenderControl che chiama
  • Control.RenderChildren che passa in rassegna tutti i controlli figlio e infine chiama
  • HtmlForm.RenderControl che chiama
  • HtmlForm.RenderChildren che è ciò che ci interessa

Da Reflector:

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();
    }
}

Nota le chiamate a page.BeginFormRender e page.EndFormRender. Tra questi, il modulo chiama base.RenderChildren che alla fine chiamerà il metodo Render sul tuo controllo utente personalizzato. Quindi, per essere fedeli alla domanda originale, non è possibile interagire con la parte degli script ClientScriptBlocks in qualsiasi momento durante la sequenza di rendering di qualsiasi controllo figlio poiché sono già stati emessi nel flusso di risposta. Puoi puoi aggiungere script a questo blocco durante la sequenza Render se sei nel metodo Render della Pagina prima di chiamare base.Render, come dice Tim, ma questo non funziona in un controllo figlio di alcun tipo .

Se la sequenza di rendering è tutto ciò che devi lavorare (questa è la situazione in cui mi trovo), puoi utilizzare ClientScript.RegisterStartupScript durante il rendering del controllo, poiché RenderClientStartupScripts viene chiamato durante page.EndFormRender, che si verifica dopo viene richiesto il rendering dei controlli, come puoi vedere nel codice sopra.

Logicamente, il tuo script di avvio deve essere renderizzato e registrato sulla pagina, quindi l'evento Page_PreRender sembra essere una buona scommessa. Successivamente, l'HTML e lo script per la pagina vengono "bloccati".

Anche sulla pagina principale, puoi chiamarlo durante PreRender. La funzione Render di ogni controllo viene chiamata dopo il PreRender della pagina principale, quindi la funzione Render sarebbe un posto sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top