Обновление данных с использованием AJAX на главной странице ASP - PullRequest
0 голосов
/ 16 января 2012

У меня есть некоторые процессы, которые выполняются как фоновое задание, позволяя пользователю продолжать использовать страницу, когда задания завершены (что может занять несколько минут). Я хочу показать сообщение пользователю, лучшее местодля отображения это будет главная страница AFAIK (если они перемещаются со страницы на страницу на сайте), поэтому я определил div в файле masterpage.

Я пытаюсь найти лучший метод для отображения данных, на данный момент у меня есть метод в файле vb masterpage, который опрашивает базу данных, чтобы узнать, есть ли работа (которая включает в себя сложную логику и некоторый доступ к БД)завершил, если он имеет, он показывает сообщение в div, например, «Задание 13132 выполнено» - который работает нормально.

Проблема в том, что это не динамический, и мне нужно обновить страницу, чтобы вызватьфункция, которая проверяет, завершены ли процессы, как я могу использовать AJAX для автоматической доставки этого контента каждые 5 секунд?

Я пытался использовать таймер asp с 5-секундным временем тика, но вся страница обновляется по таймерусобытие клика каждые 5 секунд.

Protected Sub Timer1_Tick(Byval sender as Object, Byval e As EventArgs)
    poll_results()
End Sub

Public Sub poll_results()

 'database access logic 

 If dbtable.isCompleted = True
     Dim sb As New StringBuilder()
     sb.Append("$('#status').html('Job abc123 is complete');")
     Page.ClientScript.RegisterStartupScript(GetType(Page), "myscript", sb.ToString(), True)
 End If

End Sub

Есть ли способ обновить div только обновленным сообщением без полного обновления с использованием этого кода?Или, если это невозможно, есть ли какой-либо способ повторить вышеупомянутую функцию, используя jQuery, и все же иметь возможность обновлять текст DIV, только если работа завершена?

Ответы [ 2 ]

0 голосов
/ 16 января 2012

Вы можете легко бросить то, что мы назвали, асинхронный вызов , вместо этого вызывая ваш метод на той же странице, просто создайте папку async на своем веб-сайте и добавьте новый универсальный обработчик , позвоните на страницу, например checkPendingJobs.ashx.

на этой странице, добавьте ваш текущий метод:

Public Sub ProcessRequest (Byval context as HttpContext)

    Dim r As String = ""

    If dbtable.isCompleted = True
       Dim sb As New StringBuilder()
       r = "Job abc123 is complete"
    End If     

    context.Response.ContentType = "text/plain"
    context.Response.Write(r)
}

Теперь, когда вы сделали Серверную часть , давайте сделаем клиентскую часть, на вашей странице добавим этот код jQuery на главную страницу тура, ведьма будет срабатывать каждый раз, когда кто-нибудь обновляет страницы, или вы можете использовать setInterval() для проверки каждые XX секунд:

<script>

var checkJobs = true;

$(document).ready(function() {

    // every time someone refreshes the page
    checkPendingJobs();

    // every 5 seconds...
  setInterval(function(){ checkPendingJobs(); }, 5000);

});

function checkPendingJobs() {
    // no need to check it if we already have a valid response
    if(!checkJobs) return;

    // caching issue trick
    var now = new Date(); 

    $.ajax({
        url: "../async/checkPendingJobs.ashx",
        type: "GET",
        data: { t: now.getTime() },
        success: function(data) {

            // do we have text to show?
            if(data.length > 0) {
                alert(data);
                checkJobs = false; // no need to check it more...
                // $('#status').html(data);
            }
        },
        error: function(msg) {
            alert('Error found:\n' + msg);
        }
    });        
}

</script>
0 голосов
/ 16 января 2012

Наиболее распространенным подходом к этому является создание одной страницы, которая будет отображать либо JSON, либо HTML. Это метод «poll_results», думайте об этом как poll_result.aspx. Вы можете либо передать один идентификатор задания на эту страницу, либо просто выполнить опрос для всех заданий, которые были завершены с момента последнего опроса.

На вашей главной странице будет фрагмент JavaScript, который будет использовать таймер (таймер JavaScript на стороне клиента) для отправки AJAX-запроса на сервер, попав на страницу «poll_request.aspx». Эта страница вернет либо HTML, либо JSON, и вы напишите немного JavaScript, чтобы показать ваше сообщение. Если вам нужны примеры кода, дайте мне знать.

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