2012-02-14 1 views
0

J'écris une application ASP.Net Web Forms qui comporte quelques opérations dorsales lentes, donc j'essaie d'utiliser UpdatePanels pour effectuer les opérations de manière asynchrone.Pourquoi un déclenchement UpdatePanel entraîne-t-il la disparition de tous les autres contenus?

Je souhaite que ces opérations soient uniquement exécutables une à la fois, et informent les autres utilisateurs lorsque quelqu'un effectue l'une de ces opérations. Comme une manière rapide et sale de le faire, je veux mettre en place un simple dialogue modal avec un masque derrière lui, désactivant l'accès au site pendant une opération. Je le fais dans le MasterPage partagé sur toutes les pages du site.

J'ai bloqué le modal dans un UpdatePanel, et y ai mis un timer pour vérifier une variable globale (from ApplicationState) pour l'état actuel. S'il exécute une tâche, affichez le modal, sinon désactivez-le en définissant Visibility = False. Je veux seulement que le contenu soit mis à jour, donc je m'assure que EnablePartialRendering = "true" dans mon ScriptManager et que je mets à jour UpdateModel = "Contitional" sur le UpdatePanel. J'appelle même .Update() dans l'événement Tick du Timer.

Ça me semble plutôt bien. Pour tester, j'obtiens le modal pour allumer et éteindre aléatoirement. Jusqu'à présent, la minuterie fonctionne un régal et le modal affiche et se cache comme un champion. Le seul problème est, après la deuxième fois que le modal est caché, TOUT disparaît. Donc, ... à être, le modal est caché, la page principale s'affiche bien. Ensuite, la minuterie se déclenche, le modal est affiché, superposant magnifiquement la page principale. La minuterie se déclenche à nouveau, et le modal disparaît, mais tout le reste aussi!

Je vérifie la source html active derrière 'inspect element' dans Chrome et le contenu a disparu!

Il me manque quelque chose de très évident ici ...

Voici mon code:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="OPTH.DesktopRollout.Website.SiteMaster" %> 

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
    <head runat="server"> 
     <title></title> 
     <link href="~/Styles/Site.css" rel="stylesheet" type="text/css" /> 
     <asp:ContentPlaceHolder ID="HeadContent" runat="server"> 
     </asp:ContentPlaceHolder>  
    </head> 
    <body> 
     <form runat="server"> 
      <asp:ScriptManager ID="MainSM" runat='server' EnablePartialRendering="True" />   

      <asp:Timer runat="server" ID="CheckTimer" Interval="500" OnTick="CheckTimer_Tick"></asp:Timer> 

      <asp:UpdatePanel runat="server" ID="ModalUp" UpdateMode="Conditional" RenderMode="Block" > 
       <Triggers> 
        <asp:AsyncPostBackTrigger controlid="CheckTimer" eventname="Tick" /> 
       </Triggers> 
      <ContentTemplate>    
       <asp:Panel id="modalPnl" runat="server"> 
        <div class="modalPopup"> 
         <div id="modalContent">Currently performing task: '<asp:Literal runat="server" ID="TaskNameLtr" />'. Please wait till it has completed before continuing.</div>     
        </div> 
        <div class="modalOverlay" />  
       </asp:Panel>       
      </ContentTemplate> 
      </asp:UpdatePanel> 

    //... other content is here... just static html and a ContentPlaceHolder for basepage. 

Code Backend:

protected void CheckTimer_Tick(object sender, EventArgs e) 
    { 

     modalPnl.Visible = IsExecutingTask; //Returns a random true or false based on time. 
     TaskNameLtr.Text = DateTime.Now.ToShortDateTimeString(); 
     ModalUp.Update(); 
    } 

Senseis! Qu'est-ce que cette jeune sauterelle fait mal?

Je ne pense pas que cela n'a rien à voir avec elle, mais mon CSS:

.modalOverlay 
    { 
     position: fixed; 
     width: 100%; 
     height: 100%;  
     background-color: black; 
     z-index: 1; 

     filter: alpha(opacity=50); /* internet explorer */ 
     -khtml-opacity: 0.5;  /* khtml, old safari */ 
     -moz-opacity: 0.5;  /* mozilla, netscape */ 
     opacity: 0.5;   /* fx, safari, opera */  
    } 

    .modalPopup 
    { 
     position: fixed; 
     margin-left: -225px;  
     top: 40%; 
     left: 50%; 
     width: 450px; 
     height:100px; 
     background-color: white; 
     border: black solid 3px; 
     z-index: 2; 

     filter: alpha(opacity=100); /* internet explorer */ 
     -khtml-opacity: 1;  /* khtml, old safari */ 
     -moz-opacity: 1;  /* mozilla, netscape */ 
     opacity: 1;   /* fx, safari, opera */ 
    } 

    .modalPopup #modalContent 
    { 
     margin: 15px 30px;  
    } 

Toutes les idées? MISE À JOUR: Je viens de déplacer tout le code AJAX de la MasterPage à Default.aspx. Maintenant, sur la publication asynchrone, le contenu de Masterpage reste, mais le contenu de Default.aspx disparaît.

+0

je devais utiliser session, car Panel mise à jour efface toutes les variables de la page maître – Toolkit

Répondre

0

Vous devez ajouter à nouveau les contrôles à la page à l'intérieur du panneau de mise à jour, sinon la fonction de chargement de votre page maître efface les contrôles et donc les actions de ces contrôles ne fonctionnent plus

Questions connexes