2008-10-08 8 views
1

У меня есть кнопка на моей веб-форме. При нажатии этой кнопки выполняется HttpWebRequest во время обработчика события onclick. После запроса мы копируем ответ из запроса в HttpContext.Current.Response и отправляем его клиенту.Отображение Загрузка текста при выполнении WebRequest

Этот веб-запрос может занять некоторое время (до 5 секунд, так как он создает отчет). В течение этого времени у пользователя нет никаких указаний на то, что что-то происходит, за исключением полосы хода браузера и вращающегося IE-значка (если они используют IE). Поэтому, когда это происходит, мне нужен индикатор загрузки.

Я пробовал использовать javascript, который срабатывает во время события onclick кнопки (с помощью OnClientClick), и пока это работает, я не знаю, как узнать, когда веб-запрос будет завершен. Поскольку мы просто отправляем ответ клиенту, полной обратной передачи не происходит.

Я пробовал обернуть кнопку в UpdatePanel и использовать UpdateProgress, но когда мы отправляем ответ на HttpContext.Current.Response и вызываем Response.End(), мы получаем ошибку в javascript, так как ответ (мы отправляем обратно лист excel для загрузки пользователем).

Поскольку мы отправляем обратно файл для загрузки пользователям, я не хочу всплывать отдельное окно, так как в IE они получают информационную панель, блокирующую загрузку.

Любые идеи здесь?

ответ

4

В качестве альтернативы профессиональной библиотеке AJAX.NET jQuery имеет действительно хороший способ сделать это.

Посмотрите на this example использования.NET PageMethod (если возможно, в вашем сценарии).

Вы определяете вызов метода страницы в jQuery, вы можете использовать ваше сообщение ... в скрытом div.

Скажите, какой обратный вызов вы хотите вернуть с успехом (т. Е. Когда ваш 5-секундный отчет сгенерирован) затем скрыть загрузку и обработать данные.

Посмотрите на javascript on my contact page для примера (ознакомьтесь с исходным кодом).

  1. У меня есть кнопка на странице, добавьте jQuery onClick.
  2. При нажатии кнопки, отображающей скрытый загрузочный div, выполняется вызов ajax на метод страницы, который принимает параметры формы.
  3. Метод страницы отправляет по электронной почте и т. Д., А затем возвращает форму в методе onSuccess javascript, который у меня есть.
  4. OnSuccess скрывает загрузочный div.
1

Простой трюк, который я использовал в прошлом, - это перенаправить на промежуточную страницу с анимированной панелью выполнения (gif), а затем на этой странице сделать REAL сообщение данных. (или даже всплывающий слой с анимацией на нем и вежливое сообщение с просьбой подождать минуту или две)

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

Другим подходом является передача данных в рабочий поток и немедленное возвращение с сообщением о том, что отчет будет отправлен по электронной почте или предоставлен в разделе «отчеты» на сайте, когда он будет готов. Этот подход не имеет преимущества мгновенного уведомления, когда отчет завершен.

+0

Проблема с перенаправлением страницы заключается в том, что в конечном итоге вы получаете уродливую информационную панель в IE, предотвращающую их загрузку. Я не хочу добавлять на наш веб-сайт совершенно новый раздел для получения отчетов. В любом случае это может занять больше времени для пользователя. – Ray 2008-10-09 01:39:02

1

Вот мое решение:

  1. Скачать и изучить образцы свободной Professional AJAX.NET библиотеки.
  2. Напишите AjaxMethod, который создает файл и возвращает местоположение файла в качестве параметра.
  3. Напишите функцию клиентской функции для вызова метода на шаге 2. Когда этот метод называется индикатором.
  4. Напишите метод обратного вызова на стороне клиента, чтобы скрыть индикатор и показать/загрузить файл, который запросил пользователь.
  5. Добавьте свои вызовы на стороне клиента на ваш элемент кнопки.

Когда ваш метод на стороне сервера завершает ваш обратный вызов, вызывается.

Надеюсь, это поможет!

0

Решение, которое я представляю здесь, предназначено для показа метода, позволяющего отображать окно «Загрузка ...» во время обработки на стороне сервера и исчезать при завершении обработки на стороне сервера.

Я сделаю это с помощью самого простого механизма AJAX (протестирован на FF, но IE тоже должен быть в порядке), то есть не использовать фреймворк вроде Prototype или jQuery или Dojo, поскольку вы не указали свои знания о них ,

Чтобы вы могли лучше понять трюк, следующее является лишь небольшим примером и не претендует на то, чтобы быть готовым решением. Я склонен не быть поверхностным, но я думаю, что более ясный пример может объяснить лучше, чем многие слова.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
    <title>First Example</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <style> 
      .hidden { 
       display: none; 
      } 
      .loadingInProgress { 
       color: #FFFFFF; 
       width: 75px; 
       background-color: #FF0000; 
      } 
     </style> 
    <script type="text/javascript"> 
     var httpRequest; 
     if (window.XMLHttpRequest) { // Mozilla, Safari, ... 
      httpRequest = new XMLHttpRequest(); 
      httpRequest.overrideMimeType('text/xml'); 
     } else if (window.ActiveXObject) { // IE 
      try { 
       httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
      } 
      catch (e) { 
       try { 
        httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       catch (e) {} 
      } 
     } 

     if (!httpRequest) { 
      alert('Giving up :(Cannot create an XMLHTTP instance'); 
     } 

     httpRequest.onreadystatechange = function(){ 
      switch (httpRequest.readyState) { 
      case 1: // Loading 
       document.getElementById('loading').className = "loadingInProgress"; 
       break; 
      case 4: // Complete 
       document.getElementById('loading').className = "hidden"; 
       if (httpRequest.status == 200) { 
        // perfect! 
       } else { 
        // there was a problem with the request, 
        // for example the response may be a 404 (Not Found) 
        // or 500 (Internal Server Error) response codes 
       } 
       break; 
      } 
     }; 

     function go() { 
      httpRequest.open('GET', document.getElementById('form1').action, true); 
      httpRequest.send(''); 
     } 
    </script> 

    </head> 
    <body> 
     <div id="loading" class="hidden">Loading...</div> 
     <form id="form1" name="form1" action="doSomething.php"> 
      <input type="button" value="Click to submit:" onclick="go()" /> 
     </form> 
    </body> 
</html> 

Как вы можете видеть, что есть <div>, который держит "Loading ..." сообщение.

Принцип заключается в том, чтобы показать/скрыть <div> в зависимости от XMLHttpRequest объекта readyState.

Я использовал обработчик onreadystatechangeXMLHttpRequest, чтобы вызвать изменение readyState.

Внутренний PHP-скрипт, который я использую (объявленный как форма action), выполняет только сон (5), чтобы сообщение «Загрузка ...» появилось в течение 5 секунд.

<?php 
sleep(5); 
header('Cache-Control: no-cache'); 
echo "OK"; 
?> 

Cache-control: no-cache заголовка необходимо, так как, как правило, если вы не установите браузер будет кэшировать ответ избегая повторно отправить запрос, если вам необходимо нужно.

Хороший источник для «начала работы» Документация AJAX - Mozilla MDC.

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


Edit:

Я выбрал PHP, потому что я не знаю, ASP.NET, ни ASP, жаль об этом.


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

  • Нет связанных вопросов^_^