Ajax-запрос возвращает 200 OK, но событие с ошибкой запускается вместо успеха

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

Код jQuery

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);
}

Код С# для 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") после успешного удаления. Я могу удалить контент, но я не получаю это сообщение. Это правильно или я делаю что-то неправильно? Каков правильный способ решения этой проблемы?

620
задан Pankaj Mishra 31 мая '11 в 14:17
источник поделиться

15 ответов

Ваш запрос Ajax содержит следующую настройку:

dataType: "json"

В документации указано, что jQuery:

Оценивает ответ как JSON и возвращает объект JavaScript. (...) Данные JSON обрабатываются строгим образом; любой некорректный JSON отклоняется и возникает ошибка синтаксического анализа.

Это означает, что если сервер возвращает недействительный JSON с состоянием 200 OK, тогда jQuery запускает функцию ошибки и устанавливает параметр textStatus на "parsererror".

Решение. Убедитесь, что сервер возвращает действительный JSON. Стоит отметить, что пустой ответ также считается недействительным JSON; вы можете вернуть {} или null, например, которые проверяются как JSON.

Вы можете проверить, является ли JSON действительным или нет на jsonlint.com.

929
ответ дан Salman A 31 мая '11 в 14:31
источник поделиться

Мне повезло с использованием нескольких разделенных пробелами dataType (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
});
27
ответ дан jaketrent 15 июня '11 в 17:47
источник поделиться

Вам просто нужно удалить 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
});
24
ответ дан Philippe Genois 07 окт. '16 в 6:23
источник поделиться

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

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

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

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

14
ответ дан Corvin 29 июня '15 в 11:35
источник поделиться

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

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

Response.Write(OutPut);

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

function AjaxFailed (XMLHttpRequest, textStatus) {

}

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

12
ответ дан LeftyX 31 мая '11 в 14:36
источник поделиться

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

Затем в вашем вызове Ajax укажите dataType='text'.

Он разрешит проблему.

10
ответ дан Suresh Vadlakonda 11 мая '16 в 5:10
источник поделиться

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

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

5
ответ дан Bilel omrani 30 нояб. '14 в 2:56
источник поделиться

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

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}
3
ответ дан Alexander Suleymanov 25 июня '15 в 17:53
источник поделиться

Еще одна вещь, которая меня перепутала, заключалась в использовании localhost вместо 127.0.0.1 или наоборот. По-видимому, JavaScript не может обрабатывать запросы от одного к другому.

1
ответ дан Paul 30 янв. '14 в 10:57
источник поделиться

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

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;
1
ответ дан Terry Lin 11 мая '15 в 8:52
источник поделиться

У меня есть аналогичная проблема, но когда я попытался удалить тип данных: "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); }
    });
}
0
ответ дан Rakesh Kumar 09 июня '18 в 3:49
источник поделиться

У меня была та же проблема. Это связано с тем, что мой ответ JSON содержит некоторые специальные символы, а файл сервера не был закодирован с помощью UTF-8, поэтому вызов Ajax считал, что это недействительный ответ JSON.

0
ответ дан Mehdi Izcool 22 марта '16 в 21:57
источник поделиться

Смотрите это. Его аналогичная проблема. Работаю я.

Не удаляйте dataType: 'JSON',

Примечание: только echo JSON Formate в PHP файле, если вы используете только php echo, возвращайте код ajax-кода 200

0
ответ дан Inderjeet 01 мая '18 в 10:40
источник поделиться

Ваш сценарий требует возврата в тип данных JSON.

Попробуй это:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}
-1
ответ дан Kashif Faraz 21 апр. '18 в 6:10
источник поделиться

Попробуйте выполнить

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: { "Operation" : "DeleteRow", 
            "TwitterId" : 1 },
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

ИЛИ

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow&TwitterId=1',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

Используйте двойные кавычки вместо одиночных кавычек в объекте JSON. Я думаю, что это решит проблему.

-10
ответ дан Salman Riaz 31 мая '11 в 14:39
источник поделиться

Другие вопросы по меткам