2010-09-10 10 views
9

Ho dovuto implementare alcune modifiche a un controllo utente utilizzato in un paio di pagine. Il controllo utente contiene alcuni JQuery per gestire un'attività di paginazione (visualizza 3 mesi di dati e nasconde 9 alla volta). Quando il controllo è caricato, visualizzerà automaticamente il quarto corrente ed eseguirà questo codice in $ (document) .ready().Il postback asincrono non causa document.ready da eseguire

Il problema che ho è che in una delle pagine viene utilizzato il controllo utente, il controllo non è visibile al caricamento della pagina. Un postback asincrono viene usato per cambiare la visibilità ma questo non viene eseguito ready().

Ho trovato uno snippet che consente alla pagina di hosting di intercettare l'EndResponse del postback parziale, ma non riesco ancora a eseguire la funzione all'interno di usercontrol.

Qualcuno ha qualche suggerimento?

Acclamazioni

Dave

+0

Si sta utilizzando UpdatePanels? –

+0

Sì, la pagina principale contiene un numero di pannelli di aggiornamento: il pannello contenente questo controllo utente contiene anche altri 4 o 5. – Dave

+4

Vedere http://stackoverflow.com/questions/1152946/how-to-have-a-javascript-callback-executed-after-an-update-panel-postback/1153002#1153002 –

risposta

11

come ho fatto, si sta andando ad odiare la risposta di Microsoft prescritto. La risposta "prescritta" consiste nell'utilizzare PageRequestManager per impostare un gestore richieste. Questo gestore di richieste viene (quindi) eseguito dopo il completamento di ogni postback parziale.

Il gestore richieste Esempio:

<script id="events" type="text/javascript"> 

    jQuery(document).ready(function() { 

     // Your normal code goes here 
     setupSomething(); 
     initializeSomethingElse(); 

     // Setup your partial-postback event handler. 
     // This is used to rewire all events since all are 'lost' after partial-postback. 
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(requestHandler); 
    }); 

    ///<summary>partial postback event handler. Executed after the partial postback is completed. Clears modal popup textboxes</summary> 
    ///<param name="sender"></param> 
    ///<param name="args">http://www.asp.net/ajax/documentation/live/ClientReference/Sys.WebForms/EndRequestEventArgsClass/default.aspx</param> 
    function requestHandler(sender, args) { 

     if (args.get_error() == undefined) { 

      // Your normal code goes here 
      setupSomething(); 
      initializeSomethingElse(); 
     } 
     else 
      alert(args.get_error()); // Do something 
    } 
</script> 

che ci porta alla semplice risposta:
Perché non inizializzare l'utente-controllo in modo esplicito dal code-behind e mantenere che l'inizializzazione JavaScript all'interno il tuo utente controlla HTML (stesso).

void YourUserControl_PreRender(object sender, EventArgs e) 
{ 
    try 
    { 

    } 
    catch (Exception ex) 
    { 

    } 
    finally 
    { 
     // Do this 
     ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "registerInitializer", buildInitializer(), true); 
    } 
} 

Una volta reso, la logica "buildInitializer" dice, "Se questa funzione presente sul client ... chiamarlo." E ... funziona ogni volta.

private string buildInitializer() 
{ 
    StringBuilder javascript = new StringBuilder(); 

    javascript.Append("if (window.initializeMyControl) {"); 
    javascript.Append("if(typeof window.initializeMyControl == 'function') { initializeMyControl(); }"); 
    javascript.Append("}"); 

    return javascript.ToString(); 
} 

adesso Il tuo User-controlli di inizializzazione può vivere nel User-Control dove dovrebbe essere:

<script type="text/javascript"> 
    function initializeMyControl() { 

     // Your normal code goes here 
     setupSomething(); 
     initializeSomethingElse(); 
    } 
</script> 
+0

+1 Risposta molto utile, grazie. Dopo aver implementato la tua soluzione ho visto quel commento popolare nella domanda e risolto il mio problema con molto meno codice: http://stackoverflow.com/questions/1152946/how-to-have-a-javascript-callback-executed-after- un-update-panel-postback/1153002 # 1153002 – daniloquio

Problemi correlati