Ajax-запрос возвращает 200 OK, но вместо успеха запускается событие ошибки
я реализовал запрос Ajax на своем веб-сайте, и я вызываю конечную точку с веб-страницы. Он всегда возвращает 200 ОК, но 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);
}
код 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") строка после успешного удаления. Я могу удалить содержимое, но я не получаю это сообщение. Это правильно или я делаю что-то неправильно? Как правильно решить эту проблему?
15 ответов:
jQuery.ajaxпытается преобразовать тело ответа в зависимости от указанного илиContent-Typeзаголовков, отправляемых сервером. Если преобразование завершается неудачно (например, если JSON/XML является недопустимым), вызывается обратный вызов ошибки.
ваш AJAX-код содержит:
dataType: "json"в этом случае jQuery:
оценивает ответ как JSON и возвращает объект JavaScript. […] Данные JSON парсится в строгом порядке; любой некорректный JSON-это отклонено и возникает ошибка синтаксического анализа. [ ... ] пустой ответ также отклонено; вместо этого сервер должен вернуть ответ null или {}.
ваш серверный код возвращает HTML-фрагмент с
200 OKстатус. jQuery ожидал действительного JSON и поэтому запускает обратный вызов ошибки, жалуясь наparseerror.решение состоит в том, чтобы удалить
dataTypeпараметр из вашего кода jQuery и сделать код на стороне сервера возвращение:Content-Type: application/javascript alert("Record Deleted");но я бы предпочел вернуть ответ JSON и отобразить сообщение внутри обратного вызова успеха:
Content-Type: application/json {"message": "Record deleted"}
мне повезло с использованием нескольких, разделенных пробелом
dataTypes (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 });
вы просто должны удалить тип данных:"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 });
Это просто для записи, так как я наткнулся на этот пост при поиске решения моей проблемы, которая была похожа на ОП.
в моем случае мой запрос jQuery Ajax был предотвращен из-за политика того же происхождения в Chrome. Все было решено, когда я изменил свой сервер (узел.js) делать:
response.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "http://localhost:8080" });Это буквально стоило мне часа биться головой об стену. Я чувствую себя глупо...
Я считаю, что ваша страница aspx не возвращает объект JSON. Ваша страница должна сделать что-то вроде этого (page_load)
var jSon = new JavaScriptSerializer(); var OutPut = jSon.Serialize(<your object>); Response.Write(OutPut);кроме того, попробуйте изменить свой AjaxFailed:
function AjaxFailed (XMLHttpRequest, textStatus) { }
textStatusдолжен дать вам тип ошибки, которую вы получаете.
я столкнулся с этой проблемой с обновленной библиотекой jQuery. Если метод службы ничего не возвращает, это означает, что тип возвращаемого значения
void.тогда в вашем вызове Ajax, пожалуйста, укажите
dataType='text'.это решит проблему.
вы просто должны удалить
dataType: 'json'из вашего заголовка, если ваш реализованный метод веб-службы недействителен.в этом случае вызов Ajax не ожидает иметь тип данных возврата JSON.
У меня была та же проблема. Моя проблема заключалась в том, что мой контроллер возвращал код состояния вместо JSON. Убедитесь, что ваш контроллер возвращает что-то вроде:
public JsonResult ActionName(){ // Your code return Json(new { }); }
еще одна вещь, которая испортила все для меня было использование
localhostвместо 127.0.0.1 или наоборот. По-видимому, JavaScript не может обрабатывать запросы от одного к другому.
используйте следующий код, чтобы убедиться, что ответ находится в формате JSON (версия PHP)...
header('Content-Type: application/json'); echo json_encode($return_vars); exit;
У меня была та же проблема. Это было потому, что мой ответ JSON содержит некоторые специальные символы, а файл сервера не был закодирован с помощью UTF-8, поэтому вызов Ajax считал, что это не был допустимый ответ JSON.
посмотреть этот. Также аналогичная проблема. Работая я старался.
не удалить
dataType: 'JSON',Примечание: echo только JSON Formate в PHP-файле если вы используете только php echo ваш ajax-код возвращает 200
У меня аналогичная проблема, но когда я попытался удалить тип данных:'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); } }); }
ваш скрипт требует возврата в тип данных JSON.
попробуйте это:
private string test() { JavaScriptSerializer js = new JavaScriptSerializer(); return js.Serialize("hello world"); }
попробовать следующие
$.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. Я думаю, что это решит проблему.
Comments