2010-09-10 4 views
9

J'ai dû mettre en œuvre des changements à un contrôle utilisateur qui est utilisé dans deux ou trois pages. Le contrôle utilisateur contient du JQuery pour gérer une tâche de pagination (affiche 3 mois de données et cache 9 à la fois). Lorsque le contrôle est chargé, il affiche automatiquement le trimestre en cours et exécute ce code dans $ (document) .ready().Async postback ne provoque pas document.ready à exécuter

Le problème est que j'ai dans l'une des pages du contrôle utilisateur est utilisé, le contrôle ne soit pas visible sur la charge de page. Une publication asynchrone est utilisée pour modifier la visibilité mais elle n'exécute pas ready().

Je trouve un extrait qui permet à la page d'hébergement pour intercepter le endResponse du postback partiel, mais je ne peux toujours pas exécuter la fonction dans le usercontrol.

Quelqu'un at-il des suggestions?

Vive

Dave

+0

Utilisez-vous UpdatePanels? –

+0

Oui, la page principale contient un certain nombre de panneaux de mise à jour - le panneau contenant ce contrôle utilisateur en contient également 4 ou 5 autres. – Dave

+4

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

Répondre

11

Comme je l'ai fait, vous allez détester la réponse de Microsoft prescrit. La réponse "prescrite" est d'utiliser le PageRequestManager pour installer un gestionnaire de requêtes. Ce gestionnaire de requêtes est (ensuite) exécuté après chaque publication partielle.

Le Gestionnaire de demandes Exemple:

<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> 

Cela nous amène à la simple réponse:
Pourquoi ne pas initialiser votre utilisateur contrôle explicitement à partir de votre code-behind et garder que JavaScript d'initialisation dans les votre utilisateur contrôle HTML (lui-même). Une fois rendue, la logique "buildInitializer" dit: "Si cette fonction existe sur le client ... appelez-la." Et ... ça marche à chaque fois.

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

maintenant User-Controls Initialisation peut vivre dans l'utilisateur contrôle où il devrait être:

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

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

1 réponse Très utile, merci. Après avoir implémenté votre solution, j'ai vu ce commentaire populaire dans la question et résolu mon problème avec beaucoup moins de code: http://stackoverflow.com/questions/1152946/how-to-have-a-javascript-callback-executed-after- an-update-panel-postback/1153002 # 1153002 – daniloquio

Questions connexes