Как обновить страницу во время асинхронной обратной передачи? - PullRequest
1 голос
/ 21 июля 2011

Я в тупике.Я пытаюсь показать индикатор выполнения, пока мой сайт выполняет запрос.Запрос занимает от 4 до 6 минут.Мой индикатор выполнения получает свое значение из базы данных, Oracle имеет встроенный запрос для предоставления значений в индикатор выполнения.Я использую EssentialObjects 'ProgressBar .Обычно я просто устанавливаю «Value» в целое число от 1 до 100.

Вот упрощенная версия моего кода:

Страница:

 <asp:UpdatePanel ID="upQuery" runat="server">
    <ContentTemplate>
        <asp:Button ID="btnExecute" runat="server" OnClick="btnExecute_Click" />
    </ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="upProgress" runat="server">
    <ContentTemplate>
        <asp:Timer ID="tmr" runat="server" Enabled="false" 
                   OnTick="tmr_Tick" Interval="3000"></asp:Timer>
        <eo:ProgressBar ID="pbr" runat="server" ></eo:ProgressBar>
    </ContentTemplate>
</asp:UpdatePanel>

Код:

protected void btnExecute_Click(object sender, EventArgs e) {
        tmr.Enabled = true;
        ExecuteLongQuery();
}

protected void tmr_Tick(object sender, EventArgs e) {
        pbr.Value = GetProgress();
}

Обычно, когда я нажимаю btnExecute, таймер не запускается до завершения обратной передачи, поэтому индикатор выполнения никогда не отображается.Я пробовал обратный вызов, не уверен, правильно ли я это сделал, но на странице не будет отображаться результат во время обратной передачи.Как заставить таймер (или что-то еще) ответить, когда страница находится в асинхронной обратной передаче?

Ответы [ 2 ]

5 голосов
/ 16 декабря 2011

Я нашел это, и это работает для меня.Вы можете изменить его в соответствии с вашими потребностями.Он работает для каждой обратной передачи страницы, и если вы хотите ограничить ее, измените код в соответствии с вашими требованиями.

<html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title></title>
        <style type="text/css">
             .modalPopup
             {
                 background-color: #696969;
                 filter: alpha(opacity=40);
                 opacity: 0.7;
                 xindex: -1;
             }
         </style>
     </head>
     <body>
         <form id="form2" runat="server">
              <asp:ScriptManager ID="ScriptManager2" runat="server" />
              <script type="text/javascript">
                  var prm = Sys.WebForms.PageRequestManager.getInstance();
                  //Raised before processing of an asynchronous postback starts and the postback request is sent to the server.
                  prm.add_beginRequest(BeginRequestHandler);
                  // Raised after an asynchronous postback is finished and control has been returned to the browser.
                  prm.add_endRequest(EndRequestHandler);
                  function BeginRequestHandler(sender, args) 
                  {
                      //Shows the modal popup - the update progress
                      var popup = $find('<%= modalPopup.ClientID %>');
                      if (popup != null) 
                      {
                          popup.show();
                      }
                  }

                  function EndRequestHandler(sender, args) 
                  {
                      //Hide the modal popup - the update progress
                      var popup = $find('<%= modalPopup.ClientID %>');
                      if (popup != null)  
                      {
                          popup.hide();
                      }
                  }
              </script>
              <div>
                  <asp:UpdateProgress ID="UpdateProgress1" runat="server">
                      <ProgressTemplate>
                          <asp:Image ID="Image1" ImageUrl="waiting.gif" AlternateText="Processing" runat="server" />
                      </ProgressTemplate>
                  </asp:UpdateProgress>
                  <ajaxtoolkit:modalpopupextender id="modalPopup" runat="server" targetcontrolid="UpdateProgress" popupcontrolid="UpdateProgress" backgroundcssclass="modalPopup" />
                  <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                      <ContentTemplate>
                          <asp:Button ID="Button1" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
                      </ContentTemplate>
                  </asp:UpdatePanel>
            </div>
        </form>
    </body>
</html>
4 голосов
/ 21 июля 2011

Тот факт, что вы включили таймер, не передается клиенту до завершения обратной передачи.Вот только как это работает.Выполнение кода на сервере не оказывает немедленного влияния на клиента.Если вы ожидаете завершения ExecuteLongQuery() перед отправкой ответа клиенту, то вы никогда не увидите таймер.

Лучше всего, вероятно, запустить ExecuteLongQuery() в отдельном потоке на сервере., позволяя завершить обратную передачу и запустить таймер.

Я бы предложил прочитать на жизненном цикле страницы ASP.Net - этот выглядит как хорошее место для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...