ASP.NET - Отобразите сообщение, в то время как страница загружается

У меня есть страница, которая выполняет продолжительную задачу (10 - 15 секунд) в page_load методе.

У меня есть клиентский код JavaScript, который отобразится, достойная "загрузка страницы" анимировала gif пользователю.

Я могу вызвать метод JavaScript из кода - позади, отобразить "загрузку страницы" анимировало gif, однако, продолжительная задача зависает UI, таким образом, что анимированный gif на самом деле не отображается, пока продолжительная задача не завершена, который является полной противоположностью того, что я хочу.

Для проверения этого в моем page_load методе, я звоню методу JavaScript для отображения анимированного gif. Затем я использую Поток. Сон (10000). То, что происходит, - то, что анимированный gif не отображается до окончания Потока. Сон завершен.

Очевидно, я делаю что-то неправильное.

Любой совет ценился бы.

Спасибо.

Chris

Ниже пример кода - позади:

protected void Page_Load(object sender, EventArgs e)
    {
        ClientScript.RegisterStartupScript
              (GetType(), "Javascript", "javascript: ShowWaitIndicator(); ", true);

        Response.Flush();

        Thread.Sleep(10000);
    }
5
задан Chris 10 June 2010 в 18:18
поделиться

6 ответов

Я добился этого, разместив на странице таймер. После его первого тика отключите его и запустите свою задачу.

<asp:Timer runat="server" id="UpdateTimer" interval="500" ontick="UpdateTimer_Tick" />

Для своих нужд я разместил это в UpdatePanel. Я не уверен, что это будет работать лучше для вас. Затем в вашем коде позади...

Protected Sub UpdateTimer_Tick(ByVal sender As Object, ByVal e As EventArgs)
        UpdateTimer.Enabled = False

        ' run method here

    End Sub
4
ответ дан 18 December 2019 в 13:11
поделиться

Причина в том, что событие Page.Load срабатывает до того, как какой-либо ответ был отправлен клиенту; поэтому никакие инструкции для клиента (например, выполнение вашего javascript) не выполняются, пока клиент не получит ответ.

Итак ... размещение длительной задачи в Page.Load не даст желаемого эффекта. Это похоже на случай использования AJAX или какой-либо другой формы асинхронного извлечения данных. В этом сценарии страница, которую вы возвращаете клиенту, не содержит результатов вашей длительной задачи - поэтому сама страница (с ее счетчиком) загружается быстро, затем клиент запрашивает данные; когда данные будут готовы (через 10-15 секунд), вы можете обновить DOM в клиенте с результатами.

4
ответ дан 18 December 2019 в 13:11
поделиться

Следующий пример будет работать для вас. просто поместите его в событие загрузки страницы.

  Response.Write("<div id=\"loading\" style=\"position:absolute; width:100%; text-align:center; top:300px;\"><img src=\"http://www.cse.iitk.ac.in/users/singhroh/images/loading.gif\" border=0></div>");
  Response.Flush();
  System.Threading.Thread.Sleep(5000);        
  Response.Write("script>document.getElementById('loading').style.display='none';</script>");
4
ответ дан 18 December 2019 в 13:11
поделиться

По старинке, можно отключить буферизацию. При включенной буферизации (по умолчанию) страница генерируется целиком перед отправкой клиенту. Если вы отключите буферизацию, она будет отправляться по мере загрузки, так что вы можете послать html для включения графики загрузки, выполнить вашу длительную задачу, а затем послать какой-нибудь javascript для ее отключения.

1
ответ дан 18 December 2019 в 13:11
поделиться

Похоже, что загрузка Javascript отображается после процессов загрузки ASP. Вы можете отложить выполнение трудоемких действий до Page.LoadComplete - таким образом, ваш пользователь увидит отрисовку Javascript до того, как произойдет интенсивная операция.

Затем вы обновите содержимое страницы по мере необходимости после завершения функции.

Вы можете привести пример кода?

0
ответ дан 18 December 2019 в 13:11
поделиться

Я бы избегал вызывать JavaScript из code-behind.

Вместо этого воспользуйтесь библиотекой jQuery. Вы можете вызвать ваш код сразу после загрузки DOM, используя следующий код:

$(document).ready(function() {
     //Call your JavaScript method here.
});

Вам также потребуется добавить jQuery на вашу страницу, который является единственным включением сценария из Microsoft CDN. Для этого добавьте в разметку следующее:

<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js"></script>

Это вызовет ваш метод GIF JavaScript сразу после загрузки страницы, и вы сможете обойтись без Thread.Sleep. Я предполагаю, что ваш метод анимированного GIF автоматически скрывает изображение через 10-15 секунд.

1
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: