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);
}
код 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"}
мне повезло с использованием нескольких, разделенных пробелами 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
});
вам просто нужно удалить тип данных:"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
});
Это только для записи, так как я наткнулся на этот пост при поиске решения моей проблемы, которая была похожа на OP.
в моем случае мой запрос 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 return 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. Думаю, это решит проблему.