Почему вызов abort () для ajax-запроса вызывает ошибку в ASP.Net MVC (IE8) - PullRequest
7 голосов
/ 27 мая 2010

Я использую jquery для отправки в действие контроллера MVC, которое возвращает таблицу информации. Пользователь страницы вызывает это, нажимая на различные ссылки.

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

Я обнаружил, что когда я делаю это (хотя это нормально из POV клиента), я получаю ошибки в веб-приложении о том, что

"The parameters dictionary contains a null entry for parameter srtCol of non-nullable type 'System.Int32'"

Теперь пост ajax определенно передает все параметры, и если я не пытаюсь отменить запрос ajax, он работает просто отлично.

Но если я отменю запрос, вызвав abort () для объекта XMLHttpRequest, который ajax () возвращает до его завершения, я получаю ошибку из ASP.Net MVC.

Пример:

//Cancel any pevious request
if (req)
{
    req.abort();
    req = null;
}

//Make new request
req = $.ajax({
    type: 'POST',
    url: "/Myapp/GetTbl",
    data: {srtCol: srt, view: viewID},
    success: OnSuccess,
    error: OnError,
    dataType: "html"
});

Я заметил, что это происходит только в IE8. В FF это, похоже, не решает проблему.

Кто-нибудь знает, как отменить запрос ajax в IE8, не вызывая ошибок для MVC?

Спасибо за любую помощь.

1 Ответ

3 голосов
/ 03 июня 2010

IE может отправлять часть тела запроса на сервер перед прерыванием, предоставляя серверу достаточно запросов для начала обработки, но не все параметры, которые ему нужны. Вы можете проверить это, посмотрев на активность IE в прокси (например, fiddler ) - если вы получите часть запроса, то IE плохо обрабатывает abort(). Если это так, вы можете позволить завершить старый запрос AJAX и просто запретить его OnSuccess делать что-либо, а не прерывать его.

EDIT:

var req; // current/latest request

var OnSuccess = function(data, textStatus, XMLHttpRequest) {
    if (XMLHttpRequest != req) return;
    // latest request has succeeded
}

req = $.ajax(...);

Сохраняйте ссылку на последний запрос, как вы делаете сейчас, но не прерывайте его. Вместо этого OnSuccess проверяет, соответствует ли объект запроса, переданный ему, «последнему запросу»; если они разные, вмешался другой запрос, и он прошел.

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