ASP.NET 3.5: отображение UpdateProgress во время Page_Load () - PullRequest
2 голосов
/ 26 мая 2009

Я создаю сайт ASP.NET с использованием Visual Studio 2008, и у меня есть страница, похожая на эту (материал снят)

<asp:Content ID="Content2" ContentPlaceHolderID="PageContentPlaceHolder" runat="server">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            the page here..
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="100">
        <ProgressTemplate>
            <div>
                <asp:Image ID="AjaxImage" runat="server" ImageUrl="Ajax.gif" />
            </div>
        </ProgressTemplate>
    </asp:UpdateProgress>
</asp:Content>

page_load запускает длинный (> 5 с) процесс

protected void Page_Load(object sender, EventArgs e)
{            
  if (!IsPostBack)            
  {
    LongRunningProcess();                
  }
}

Как я могу отобразить UpdateProgress во время работы LongRunningProcess? Это работает, когда я перемещаю вызов LongRunningProcess () в обработчик нажатия кнопки.

Ответы [ 6 ]

3 голосов
/ 15 февраля 2013
  1. Переместите ваш код загрузки страницы в новую функцию.
  2. Добавьте таймер AJAX в раздел ContentTemplate вашей страницы. Установите интервал 500. (1/2 секунды)
  3. Дважды щелкните объект Timer в представлении «Дизайн», чтобы создать обработчик _tick.
  4. В обработчике _tick, созданном на предыдущем шаге, вызовите следующий код

    protected void My_Timer_Tick(object sender, EventArgs e)
    {
        My_Timer_Name.Enabled = false;
        My_Page_Load_Function(); // Function created in step 1 above)
    }
    
    protected void My_Page_Load_Function()
    {
        System.Threading.Thread.Sleep(5000); // A delay to simulate doing something.
        lblMyLabel.Text = "Done!";  // Write output to page. 
    } 
    
2 голосов
/ 17 июля 2009

Создайте обычный div, который показывает Ajax.gif, так что он показывает «обработку» по умолчанию.

В функции javascript pageLoad () сделайте обратный вызов страницы, используя PageMethods Ajax.

   function pageLoad(sender, args) {
                PageMethods.getVersions(LoadVersionsCallback);
    }

Метод, который вы вызываете в файле .aspx.cs, должен быть статическим, он может принимать параметры и выглядеть примерно так:

   [System.Web.Services.WebMethod]
    public static string getVersions()
    {
      StringBuilder sb = new StringBuilder();
       ... etc.
      return sb.ToString();

    }

Функция javascript, указанная вами при вызове метода, будет запущена после его завершения. Будут переданы результаты. В конце этой функции вы скрываете раздел Ajax.gif.

   function LoadVersionsCallback(result) {
    // do something with the results - I load a dropdown list box.

   ...etc. 
    // here is where you hide your div holding the Ajax.gif  

   }

А затем вы работаете над тем, чтобы сделать все, что вы делаете, менее чем за 1 секунду ...

2 голосов
/ 26 мая 2009

Я бы поставил Ajax-таймер на страницу и установил бы его менее чем на секунду ... Он будет работать только один раз и после первого тика, тогда вам нужно отключить его, иначе он снова сработает. (Вы не хотите запускать свой длительный процесс более одного раза ...)

затем в событии OnTimerTick я бы запустил ваш длительный процесс таким образом, чтобы ваша страница полностью отображалась, и вы можете отображать ваш UpdateProgress во время его работы.

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

1 голос
/ 11 марта 2010

Я использовал приведенную выше идею JBrooks (т. Е. Показываю индикатор прогресса как часть Panel, которая также включает в себя Iframe, чтобы он отображался даже до первой загрузки Iframe), но упростил его: стилизируйте iframe так, чтобы он появлялся это поверх анимированного GIF.

Не требует Javascript или кода C #.

Вот соответствующий ASPX, за которым следует CSS. Вам придется использовать лапшу с настройкой «top» в стиле, чтобы покрыть изображение, которое вы используете.

            <asp:Panel ID="DetailPanel" runat="server" CssClass="submitBox detailPanel">
                <asp:Table ID="Table1" runat="server" Width="100%">
                    <asp:TableHeaderRow ID="TableHeaderRow10" runat="server">
                        <asp:TableCell ID="TableHeaderCell" runat="server"
                            Font-Bold="true" HorizontalAlign="Center">
                        Title Text
                        </asp:TableCell>
                    </asp:TableHeaderRow>
                    <asp:TableRow>
                        <asp:TableCell HorizontalAlign="Center">
                            <asp:Image ID="Image1" runat="server" ImageUrl="~/Images/animated_progress.gif" />
                        </asp:TableCell>
                    </asp:TableRow>
                </asp:Table>
                <div class="iframeOverlay">
                    <iframe id="IframeDetail" runat="server" style="width: 100%; height: 100%;" />
                </div>
            </asp:Panel>

.iframeOverlay { z-индекс: 2; положение: относительное; верх: -50px; }

0 голосов
/ 20 марта 2015
<script>  $(document).ready(function() {  $('#<%=
UpdateProgress1.ClientID %>').show();   }); </script>

Это хорошо сработало для меня, просто нужно было добавить его в конец раздела BODY и работать как шарм.

0 голосов
/ 06 марта 2015

С Jquery.

<script>
 $(document).ready(function() {
 $('#<%= UpdateProgress1.ClientID %>').show(); 
 });
</script>
...