Differenza tra RegisterStartupScript e RegisterClientScriptBlock?

L’unica differenza tra RegisterStartupScript e RegisterClientScriptBlock è che RegisterStartupScript mette il javascript prima del

chiusura della pagina e RegisterClientScriptBlock lo colloca subito dopo il tag

partenza della pagina?

Inoltre, quando sceglieresti l’uno rispetto all’altro? Ho scritto una breve pagina di esempio in cui ho riscontrato un problema e non sono sicuro del motivo esatto per cui sta accadendo.

Ecco il markup di aspx:

       


Ecco il codice dietro:

 protected void Page_Load(object sender, EventArgs e) { lblDisplayDate.Text = DateTime.Now.ToString("T"); } protected void btnPostback_Click(object sender, EventArgs e) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(@""); sb.Append(@"var lbl = document.getElementById('lblDisplayDate');"); sb.Append(@"lbl.style.color='red';"); sb.Append(@""); if(!ClientScript.IsStartupScriptRegistered("JSScript")) { ClientScript.RegisterStartupScript(this.GetType(),"JSScript", sb.ToString()); } } protected void btnPostBack2_Click(object sender, EventArgs e) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(@""); sb.Append(@"var lbl = document.getElementById('lblDisplayDate');"); sb.Append(@"lbl.style.color='red';"); sb.Append(@""); if (!ClientScript.IsClientScriptBlockRegistered("JSScriptBlock")) { ClientScript.RegisterClientScriptBlock(this.GetType(), "JSScriptBlock", sb.ToString()); } } 

Il problema è quando clicco sul pulsante btnPostBack , fa un postback e cambia l’etichetta in rosso, ma quando clicco su btnPostBack2 , fa un postback, ma il colore dell’etichetta non diventa rosso. Perchè è questo? È perché l’etichetta non è inizializzata?

Leggo anche che se si utilizza un UpdatePanel , è necessario utilizzare ScriptManager.RegisterStartupScript , ma se si dispone di una MasterPage , utilizzare ScriptManagerProxy ?

Ecco un vecchio thread di discussione in cui ho elencato le principali differenze e le condizioni in cui è necessario utilizzare ciascuno di questi metodi. Penso che potresti trovare utile passare attraverso la discussione.

Per spiegare le differenze come rilevanti per il tuo esempio pubblicato:

un. Quando usi RegisterStartupScript , renderà il tuo script dopo tutti gli elementi nella pagina (subito prima del tag finale del modulo). Ciò consente allo script di chiamare o fare riferimento agli elementi della pagina senza la possibilità che non li trovi nel DOM della pagina.

Ecco l’origine di rendering della pagina quando invochi il metodo RegisterStartupScript :

    
Label

b. Quando si utilizza RegisterClientScriptBlock , lo script viene visualizzato subito dopo il tag Viewstate, ma prima di qualsiasi elemento della pagina. Poiché si tratta di uno script diretto (non una funzione che può essere chiamata , verrà immediatamente eseguito dal browser, ma in questa fase il browser non trova l’etichetta nel DOM della pagina e quindi dovresti ricevere un “Oggetto non trovato” errore.

Ecco la sorgente di rendering della pagina quando invochi il metodo RegisterClientScriptBlock :

    

Quindi, per riassumere, dovresti chiamare il secondo metodo se intendi eseguire il rendering di una definizione di funzione. È quindi ansible eseguire il rendering della chiamata a tale funzione utilizzando il metodo precedente (o aggiungere un attributo lato client).

Modifica dopo commenti:


Ad esempio, la seguente funzione potrebbe funzionare:

 protected void btnPostBack2_Click(object sender, EventArgs e) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(""); //Render the function definition. if (!ClientScript.IsClientScriptBlockRegistered("JSScriptBlock")) { ClientScript.RegisterClientScriptBlock(this.GetType(), "JSScriptBlock", sb.ToString()); } //Render the function invocation. string funcCall = ""; if (!ClientScript.IsStartupScriptRegistered("JSScript")) { ClientScript.RegisterStartupScript(this.GetType(), "JSScript", funcCall); } } 

Ecco un esempio più semplice della community ASP.NET, questo mi ha dato una chiara comprensione del concetto ….

che differenza fa?

Per un esempio di questo, ecco un modo per mettere a fuoco una casella di testo su una pagina quando la pagina viene caricata nel browser – con Visual Basic usando il metodo RegisterStartupScript :

 Page.ClientScript.RegisterStartupScript(Me.GetType(), "Testing", _ "document.forms[0]['TextBox1'].focus();", True) 

Funziona bene perché la casella di testo sulla pagina viene generata e posizionata sulla pagina quando il browser scende nella parte inferiore della pagina e raggiunge questo bit di JavaScript.

Ma, se invece fosse scritto in questo modo (usando il metodo RegisterClientScriptBlock ):

 Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "Testing", _ "document.forms[0]['TextBox1'].focus();", True) 

Focus non raggiungerà il controllo della casella di testo e verrà generato un errore JavaScript nella pagina

La ragione di ciò è che il browser incontrerà il codice JavaScript prima che la casella di testo si trovi sulla pagina. Pertanto, JavaScript non sarà in grado di trovare un TextBox1.