Я выполнил запрос Ajax на своем веб-сайте, и я вызываю конечную точку с веб-страницы. Он всегда возвращает 200 OK, но 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")
после успешного удаления. Я могу удалить контент, но я не получаю это сообщение. Это правильно или я делаю что-то неправильно? Каков правильный способ решения этой проблемы?
Ваш запрос Ajax содержит следующую настройку:
dataType: "json"
В документации указано, что jQuery:
Оценивает ответ как JSON и возвращает объект JavaScript. (...) Данные JSON обрабатываются строгим образом; любой некорректный JSON отклоняется и возникает ошибка синтаксического анализа.
Это означает, что если сервер возвращает недействительный JSON с состоянием 200 OK
, тогда jQuery запускает функцию ошибки и устанавливает параметр textStatus
на "parsererror"
.
Решение. Убедитесь, что сервер возвращает действительный JSON. Стоит отметить, что пустой ответ также считается недействительным JSON; вы можете вернуть {}
или null
, например, которые проверяются как JSON.
Вы можете проверить, является ли JSON действительным или нет на jsonlint.com.
Мне повезло с использованием нескольких разделенных пробелами 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
});
Вам просто нужно удалить 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
});
dataType: "json"
или dataType: 'json'
(тип кавычек)?
Это только для записи, так как я столкнулся с этим сообщением при поиске решения моей проблемы, которое было похоже на OP.
В моем случае мой запрос jQuery Ajax был прерван из-за политики одного и того же происхождения в Chrome. Все было разрешено, когда я модифицировал свой сервер (Node.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 { });
}
Используйте следующий код, чтобы обеспечить ответ в формате JSON (версия PHP)...
header('Content-Type: application/json');
echo json_encode($return_vars);
exit;
Еще одна вещь, которая меня перепутала, заключалась в использовании localhost
вместо 127.0.0.1 или наоборот. По-видимому, JavaScript не может обрабатывать запросы от одного к другому.
У меня есть аналогичная проблема, но когда я попытался удалить тип данных: "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); }
});
}
Смотрите это. Его аналогичная проблема. Работаю я.
Не удаляйте dataType: 'JSON',
Примечание: только echo JSON Formate в PHP файле, если вы используете только php echo, возвращайте код ajax-кода 200
У меня была та же проблема. Это связано с тем, что мой ответ JSON содержит некоторые специальные символы, а файл сервера не был закодирован с помощью UTF-8, поэтому вызов Ajax считал, что это недействительный ответ JSON.
Ваш сценарий требует возврата в тип данных 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. Я думаю, что это решит проблему.
TwitterId
, вам нужно передать объектdata
, а не строку:data: {TwitterId: row}
.