Ajax-запрос возвращает 200 OK, но вместо успеха генерируется событие ошибки - PullRequest
722 голосов
/ 31 мая 2011

Я реализовал запрос Ajax на своем веб-сайте, и я вызываю конечную точку с веб-страницы.Он всегда возвращает 200 OK , но jQuery выполняет событие ошибки.Я много чего перепробовал, но не смог разобраться в проблеме.Я добавляю свой код ниже:

jQuery Code

var row = "1";
var json = "{'TwitterId':'" + row + "'}";
$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
function AjaxSucceeded(result) {
    alert("hello");
    alert(result.d);
}
function AjaxFailed(result) {
    alert("hello1");
    alert(result.status + ' ' + result.statusText);
}

C # код для JqueryOpeartion.aspx

protected void Page_Load(object sender, EventArgs e) {
    test();
}
private void test() {
    Response.Write("<script language='javascript'>alert('Record Deleted');</script>");
}

Мне нужна строка ("Record deleted") после успешного удаления.Я могу удалить контент, но не получаю это сообщение.Это правильно или я делаю что-то не так?Как правильно решить эту проблему?

Ответы [ 16 ]

1031 голосов
/ 31 мая 2011

jQuery.ajax пытается преобразовать тело ответа в зависимости от указанного параметра dataType или заголовка Content-Type, отправленного сервером.Если преобразование завершается неудачно (например, если JSON / XML недействителен), вызывается обратный вызов ошибки.


Ваш код AJAX содержит:

dataType: "json"

В этом случае jQuery:

Оценивает ответ как JSON и возвращает объект JavaScript.[…] Данные JSON анализируются строго;любой искаженный JSON отклоняется и выдается ошибка разбора.[…] Пустой ответ также отклоняется;вместо этого сервер должен вернуть нулевой или {} ответ.

Ваш код на стороне сервера возвращает фрагмент HTML со статусом 200 OK.jQuery ожидал допустимый JSON и поэтому запускает функцию обратного вызова с сообщением об ошибке parseerror.

. Решение состоит в том, чтобы удалить параметр dataType из вашего кода jQuery и вернуть код на стороне сервера:

Content-Type: application/javascript

alert("Record Deleted");

Но я бы предпочел возвратить ответ JSON и отобразить сообщение в обратном вызове успеха:

Content-Type: application/json

{"message": "Record deleted"}
30 голосов
/ 15 июня 2011

Мне повезло с использованием нескольких разделенных пробелами dataType s ( jQuery 1.5 + ). Как в:

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'text json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
29 голосов
/ 07 октября 2016

Вам просто нужно удалить dataType: "json" в вашем вызове AJAX

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json', //**** REMOVE THIS LINE ****//
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
20 голосов
/ 29 июня 2015

Это только для записи, так как я наткнулся на этот пост, когда искал решение моей проблемы, которое было похоже на OP.

В моем случае мой запрос jQuery Ajax был заблокирован из-за Политика одного и того же происхождения в Chrome.Все было решено, когда я изменил свой сервер (Node.js) так:

response.writeHead(200,
          {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "http://localhost:8080"
        });

Это буквально стоило мне часа, чтобы биться головой об стену.Я чувствую себя глупо ...

13 голосов
/ 31 мая 2011

Я считаю, что ваша страница aspx не возвращает объект JSON. Ваша страница должна сделать что-то вроде этого (page_load)

var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

Также попробуйте изменить свой AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus должен дать вам тип ошибки, которую вы получаете.

12 голосов
/ 11 мая 2016

Я столкнулся с этой проблемой в обновленной библиотеке jQuery. Если метод службы ничего не возвращает, это означает, что тип возврата - void.

Тогда в своем вызове Ajax, пожалуйста, укажите dataType='text'.

Это решит проблему.

7 голосов
/ 30 ноября 2014

Вам просто нужно удалить dataType: 'json' из заголовка, если реализованный вами метод Web-сервиса недействителен.

В этом случае при вызове Ajax не ожидается тип возвращаемого JSON-типа.

4 голосов
/ 25 июня 2015

У меня была такая же проблема.Моя проблема была в том, что мой контроллер возвращал код состояния вместо JSON.Убедитесь, что ваш контроллер возвращает что-то вроде:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}
3 голосов
/ 09 июня 2018

У меня похожая проблема, но когда я попытался удалить тип данных: 'json', у меня все еще есть проблема.Моя ошибка выполняется вместо успеха

function cmd(){
    var data = JSON.stringify(display1());
    $.ajax({
        type: 'POST',
        url: '/cmd',
        contentType:'application/json; charset=utf-8',
        //dataType:"json",
        data: data,
        success: function(res){
                  console.log('Success in running run_id ajax')
                  //$.ajax({
                   //   type: "GET",
                   //   url: "/runid",
                   //   contentType:"application/json; charset=utf-8",
                   //   dataType:"json",
                   //   data: data,
                   //  success:function display_runid(){}
                  // });
        },
        error: function(req, err){ console.log('my message: ' + err); }
    });
}
3 голосов
/ 11 мая 2015

Используйте следующий код, чтобы убедиться, что ответ представлен в формате JSON (версия PHP) ...

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...