MVC2 Один асинхронный вызов, несколько асинхронных обновлений - PullRequest
0 голосов
/ 01 марта 2010

У меня есть операция на моей странице, которая требует 3 последовательных операций (по несколько секунд каждая). Однако после каждой операции я бы хотел, чтобы контроллер возвращал частичное представление и обновлял страницу со статусом (информирует пользователя, я обнаружил, что если люди знают, что такое происходит, они меньше беспокоятся). Есть ли у MVC «способ» сделать это, или я должен просто использовать jQuery для этого?

Спасибо.

Ответы [ 5 ]

0 голосов
/ 24 августа 2010

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

Год назад:

  • Мы делали это в последовательности: действие1, затем действие2 и т. Д.
  • У нас была эта типичная страница: пожалуйста, подождите.

Трюки, которые могут вам помочь:

  • Мы выполняем параллельные запросы на стороне сервера.
  • Мы ждем результатов на странице результатов. Для загрузки javascript требуется некоторое время, поэтому во время поиска сервера мы загружаем страницу.
  • Мы спрашиваем сервер каждую секунду: вы закончили? И мы получаем частичные результаты при выполнении различных действий.

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

Мы не используем MVC, мы используем некоторые службы asmx с jQuery и ajax.

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

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

Теперь моя последняя проблема заключается в том, что все мои вызовы к моим действиям jsonResult возвращаются с textStatus «error» для клиента. Теперь, согласно документам, это означает ошибку http, но как может возникнуть ошибка http, если метод был правильно вызван на стороне сервера и был получен результат Json (проверяется путем установки точки останова на сервере)?

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

Итак, я создал небольшой хак, который, кажется, работает:

На стороне клиента у меня есть:

function onClickHandler() {
    updateUI("Beginning Batch...");
    setTimeout(klugeyClick, 0);
}

function klugeyClick() {
    $.ajax({ type: "GET", dataType: "json", url: "/ControllerName/Action1", success: function(msg) { updateUI(msg) }, async: false, error: function(XMLHttpRequest, textStatus, errorThrown) { updateUI("Action1 Error: " + XMLHttpRequest + " -- " + textStatus + " ---- " + errorThrown); } });
    setTimeout(klugeyClick2, 0);
}

function klugeyClick2() {
    $.ajax({ type: "GET", dataType: "json", url: "/ControllerName/Action2", success: function(msg) { updateUI(msg) }, async: false, error: function(XMLHttpRequest, textStatus, errorThrown) { updateUI("Action2 Error: " + XMLHttpRequest + " -- " + textStatus + " ---- " + errorThrown); } });
    setTimeout(klugeyClick3, 0);
}

function klugeyClick3() {
    $.ajax({ type: "GET", dataType: "json", url: "/ControllerName/Action3", success: function(msg) { updateUI(msg) }, async: false, error: function(XMLHttpRequest, textStatus, errorThrown) { updateUI("Action3 Error: " + XMLHttpRequest + " -- " + textStatus + " ---- " + errorThrown); } });
}

function updateUI(result) {
    $("#UIelement").text(result);
}

На стороне сервера у меня есть:

Function Action1() As JsonResult
    System.Threading.Thread.Sleep(3000)
    Return Json("Operation One Complete...")
End Function

Function Action2() As JsonResult
    System.Threading.Thread.Sleep(3000)
    Return Json("Operation Two Complete...")
End Function

Function Action3() As JsonResult
    System.Threading.Thread.Sleep(3000)
    Return Json("Operation Three Complete...")
End Function

Теперь у меня две проблемы. Во-первых, я хотел бы получить следующее сообщение, которое отображает «Batch Complete», но следуя тому же шаблону и просто добавив еще один «klugeyClick» с вызовом UpdateUI (с или без seTimeout), заставляет не отображаться последнее сообщение операции , Я думаю, что обратный вызов в методе jQuery.ajax заставляет этот kluge работать каким-то образом, но без вызова ajax я не могу поместить никаких последующих сообщений.

Следующая проблема заключается в том, что, хотя все мои вызовы поступают на мой веб-сервис и возвращают результаты json просто отлично, я всегда получаю сообщение об ошибке, возвращаемое из обратного вызова jQuery. Есть идеи, почему это может быть?

Спасибо.

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

Причина, по которой работает ваше "грязное" решение, заключается в том, что метод setTimeout() создает событие. Таким образом, ваша логика:

  1. Обновление пользовательского интерфейса
  2. Событие установки для шага 1:
    1. Начать вызов "ajax"
    2. Подождите, пока "ajax" закончит
    3. Событие установки для шага 2
      1. Начать вызов "ajax"
      2. Подождите, пока "ajax" закончит
      3. Настройка события для шага 3
        1. Начать вызов "ajax"

Именно для этого и предназначена функция обратного вызова ajax().

function Step1() {
    $.ajax({ 
        type: "GET", 
        dataType: "json", 
        url: "/ControllerName/Action1", 
        success: function(msg) { 
            updateUI(msg);
            Step2(); // call step 2 here!
        }, 
        async: true, // don't block the UI
        error: function(XMLHttpRequest, textStatus, errorThrown) { 
            updateUI("Action1 Error: " + XMLHttpRequest + " -- " + textStatus + " ---- " + errorThrown); 
        } 
    });
}
function Step2() {
    // similar to step one
}
0 голосов
/ 01 марта 2010

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

Единственный способ «связать» вызовы - это объединить все это в один, но вы не можете вернуть возвращаемые значения клиенту при возврате более чем одного вызова (почти как потоковая передача, ничего не слушая клиентский конец после того, как вы вернете свой первый набор результатов, это соединение закрыто).

...