Индикатор выполнения ASP.NET AJAX: обновление из-за кода? - PullRequest
5 голосов
/ 28 апреля 2009

У меня есть функция импорта электронной таблицы Excel в приложении. Он использует элемент управления FileUpload на данный момент. Я загружаю файл, затем запускаю операцию над этим файлом. Я хочу проинформировать пользователя о выполняемой операции и процентах, которые сделаны. Я полагаю, что могу взять общее количество строк, извлеченных из электронной таблицы Excel, и непрерывно делить, вставляя каждую запись в базу данных и обновляя индикатор выполнения.

Проблема в том, что я не могу найти какое-либо решение, которое обновляет индикатор выполнения из кода позади. Я пытался использовать решение Мэтта Берсета .

На это очень приятно смотреть, но я не вижу, как это работает из Кодекса Позади. Теоретически я полагал, что помещение значения в текстовое поле на странице и установка функции onchange для функции JavaScript для установки процента будет работать как тест, но даже это не дало мне желаемых результатов.

Какие-либо предложения относительно того, как это можно сделать?

1 Ответ

1 голос
/ 19 июня 2013

Что вам следует знать, так это то, что вы не можете проверить статус загрузки файла, используя стандартный элемент управления FileUpload. Что вы можете сделать, это загрузить файл на сервер, а затем подключиться к нему с помощью ODBC и начать чтение и вставку строк в базу данных асинхронно (с помощью запроса ajax на страницу или с помощью службы сценариев).

Что касается индикатора выполнения, вы должны просто использовать CSS-индикатор прогресса (простой пример можно найти по адресу: http://css -tricks.com / examples / ProgressBars / ).

Затем вы должны создать службу сценариев (с использованием веб-службы) с методом, который может возвращать состояние вашего прогресса с сервера:

Ваш * .asmx файл должен содержать что-то вроде:

[WebMethod]
public int GetStatus()
    {
        int progress = 0; // in percents
        // your server-side code here
        return progress;
    }

Ваша страница aspx должна содержать что-то вроде:

<asp:ScriptManager runat="server" ID="ScriptManager">
 <Services>
    <asp:ServiceReference Path="~/services/import.asmx" InlineScript="false" />
 </Services>
</asp:ScriptManager>

Затем вы сможете периодически вызывать этот метод из JavaScript (например, каждую секунду, используя setTimeout) и обновлять ширину индикатора выполнения простым JavaScript или jQuery:

var tout, service;

function UpdateStatus() {
    if (tout != null)
         clearTimeout(tout);

    if (service == null)
         service = new namespace.here.serice_class_here();

    service.GetStatus(onSuccess, onFailure);    
}

function onSuccess(result) {
    // update the width of the progress with result (the integer value of the progress)
    progress_bar.style.width = percent + "%";        

    // call the method again
    tout = setTimeout("UpdateStatus()", 1000);
}

function onFailure(error) {
    alert(error.get_message());
}

Вы можете расширить функцию JavaScript onSuccess, а по завершении процесса (возвращаемое значение равно 100%) вы можете перенаправить пользователя на другую страницу или отобразить информацию или кнопку в зависимости от ваших потребностей.

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

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