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

651

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

  • 2
    Можете ли вы запустить вывод JqueryOperation.aspx через валидатор JSON и посмотреть, является ли он действительным JSON
  • 1
    Как и jsonlint.com . Вы также должны проверить параметры, которые вы отправляете. В настоящее время вы не установили имя какого-либо параметра. Если параметром является TwitterId , вам нужно передать объект data , а не строку: data: {TwitterId: row} .
Показать ещё 8 комментариев

15 ответов

975
Лучший ответ

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

dataType: "json"

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

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

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

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

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

  • 1
    Спасибо за ваш ответ, вы можете сказать мне одну вещь, как я могу вернуть значение JSON из кода позади. Я использую Asp.net с C #. Это решило мою проблему, но, пожалуйста, дайте мне знать об этом тоже.
  • 0
    Использовать класс Json можно?
Показать ещё 9 комментариев
27

Мне повезло с использованием нескольких разделенных пробелами 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
});
  • 0
    Основываясь на документации JQuery, аналогично, сокращенная строка, такая как «jsonp xml», сначала попытается преобразовать из jsonp в xml, а в случае неудачи - из jsonp в текст, а затем из текста в xml. Так что сначала он попытается преобразовать текст в json, а если не получится, то будет рассматриваться только как текст?
23

Вам просто нужно удалить 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
});
  • 0
    Это dataType: "json" или dataType: 'json' (тип кавычек)?
  • 1
    @PeterMortensen В данном случае это не имеет значения, оба являются допустимыми упаковщиками строк JavaScript.
14

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

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

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

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

12

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

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

Response.Write(OutPut);

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

function AjaxFailed (XMLHttpRequest, textStatus) {

}

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

10

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

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

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

5

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

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

3

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

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}
1

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

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;
1

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

0

У меня есть аналогичная проблема, но когда я попытался удалить тип данных: "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

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

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

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

0

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

  • 0
    Как вы решили это?
-2

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

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

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}
-11

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

$.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. Я думаю, что это решит проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню