2010-06-10 9 views
5

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

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

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

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

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

Любые советы будут оценены.

Спасибо.

Chris

Ниже приведен пример отделенного кода:

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

     Response.Flush(); 

     Thread.Sleep(10000); 
    } 
+0

Вы не можете вызывать javascript из кода. Все, что вы можете сделать, это добавить его в поток ответов, что и делает ClientScript.RegisterStartupScript. В конечном итоге это будет отправлено обратно в браузер. Это два совершенно разных контекста. Codebehind работает на сервере, javascript выполняется в браузере. – womp

ответ

0

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

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

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

+0

Я изменил исходное сообщение, чтобы включить пример кода. – Chris

3

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

<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

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

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

1

Я бы не стал ссылаться на ваш JavaScript из кода.

Вместо этого используйте библиотеку 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 секунд.

+0

Я использую Thread.Sleep для моделирования долговременной задачи. Я попробовал ваш подход и поставил Thread.Sleep (10000) в метод page_load, и он по-прежнему не загружает gif до 10 секунд. – Chris

+1

Gotcha, я думал, что вы используете Thread.Sleep, чтобы задержать исчезновение GIF. В этом случае ответ Yoooder - лучший путь, чтобы спуститься вниз. Вы все еще можете использовать jQuery и использовать метод «.ajax» для вызова метода страницы, украшенного атрибутом «WebMethod». Здесь есть статья об этом: http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/ Ваш веб-метод будет содержать ваш Thread.Sleep to имитировать долговременную задачу. –

4

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

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>"); 
+0

Если бы такая же идея, по-видимому, вам нужно добавить Buffer = "false" в верхнюю директиву страницы, иначе она просто отображает все сразу. – John

+0

даже после выполнения Buffer = "false" это не работает – Kapil

1

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

Смежные вопросы