Отображение загрузки текста при выполнении веб-запроса - PullRequest
1 голос
/ 09 октября 2008

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

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

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

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

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

Есть идеи здесь?

Ответы [ 4 ]

4 голосов
/ 25 февраля 2009

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

Взгляните на этот пример использования .NET PageMethod (если это возможно в вашем сценарии).

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

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

Посмотрите на javascript на моей странице контактов для примера (см. Источник).

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

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

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

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

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

1 голос
/ 09 октября 2008

Простой трюк, который я использовал в прошлом, состоит в том, чтобы перенаправить на промежуточную страницу с анимированным индикатором выполнения (gif), а затем заставить эту страницу выполнить РЕАЛЬНУЮ публикацию данных. (или даже всплывающий слой с анимацией и вежливым сообщением с просьбой подождать минуту или две)

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

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

0 голосов
/ 02 марта 2009

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

Я сделаю это с помощью самого базового механизма 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>, в котором содержится сообщение "Загрузка ...".

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

Я использовал обработчик onreadystatechange XMLHttpRequest для запуска изменения readyState.

Используемый мной внутренний php-скрипт (объявленный как action формы) просто делает sleep (5), чтобы сообщение «Loading ...» появлялось в течение 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, извините за это.


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