Почему мой вызов $.ajax не возвращает объект json из файла cshtml?
У меня есть этот jquery, который использует ajax в попытке вернуть объект json, но я не профессионал в ajax, хотя я использовал его раньше с json, только я загружал файл json и не пытался вернуть строку из cshtml страница, которая запрашивает информацию в базе данных (как я делаю здесь).
Вот jQuery:
$.ajax({
url: "/AJAX Pages/Compute_Calendar_Events.cshtml",
async: true,
type: "GET",
dataType: "json",
contentType: "application/json",
success: function (jsonObj) {
console.log("AJAX SUCCESS!");
},
error: function (jqXHR, textStatus, error) {
alert("NO AJAX!");
}
});
(Также я попробовал "application/json; charset=UTF-8" как contentType, но это не меняет поведение).
Вот страница cshtml, на которую я указываю AJAX:
@{
Layout = "";
if(IsAjax || 1==1)
{
string jsonString = "{\"events\":[";
string selectQueryString = "SELECT title, summary, eventDate FROM CalendarEvents ORDER BY eventDate ASC";
var db = Database.Open("Content");
foreach (var row in db.Query(selectQueryString))
{
jsonString += "{";
jsonString += "\"title\":" + Json.Encode(row.title) + ",";
jsonString += "\"dateNumber\":" + Json.Encode(row.eventDate.ToString().Substring(0, row.eventDate.ToString().IndexOf("/"))) + ",";
jsonString += "\"dateMonth\":" + Json.Encode(row.eventDate.ToString().Substring(row.eventDate.ToString().IndexOf("/") + 1, row.eventDate.ToString().LastIndexOf("/") - (row.eventDate.ToString().IndexOf("/") + 1))) + ",";
jsonString += "\"dateYear\":" + Json.Encode(row.eventDate.ToString().Substring(row.eventDate.ToString().LastIndexOf("/") + 1, 4)) + ",";
jsonString += "\"summary\":" + Json.Encode(row.summary);
jsonString += "},";
}
jsonString = jsonString.TrimEnd(',');
jsonString += "]}";
/*System.IO.File.Delete(Server.MapPath("~/TEST.txt"));
var outputFile = System.IO.File.AppendText(Server.MapPath("~/TEST.txt"));
outputFile.Write(jsonString);
outputFile.Close();*/
@* *@@jsonString
}
else
{
Response.Redirect("~/");
}
}
Очень важно отметить пару вещей:
- Я не получаю серверную ошибку или код ошибки.
- Я записал вывод в простой файл.txt для проверки содержимого, и, вставив его в jsonLint (находится здесь: http://jsonlint.com/), я легко смог определить, что это действительно допустимый синтаксис json,
- Я по-прежнему всегда получаю предупреждающее сообщение, которое запускается только под опцией "error: function()" вызова $.ajax.
- Я не получаю пустого пространства ни до, ни после всего jsonString (не то, что это, вероятно, имеет значение).
- Я нахожусь в среде WebMatrix, C#, asp.net-webpages.
- У меня есть только два подозрения: 1) dataType и / или contentType установлены неправильно, или 2) в последний раз, когда мне пришлось использовать ajax для json (для целевого файла.json), мне пришлось изменить настройку в "IIS Express" однако, чтобы он мог получать данные из файлов json, я подумал, что это необходимо только в том случае, если на самом деле используется ajax для анализа "файла" json, а не только данных json. Кроме того, независимо от того, куда я смотрю, я не могу найти этот ресурс больше.
- Значения параметров textStatus и error: textStatus: parsererror error: SyntaxError: неожиданный токен, но, похоже, это не вызывает у меня никаких красных флагов, потому что я знаю, что синтаксис json сам по себе проверяется.
Спасибо всем за вашу помощь. Я думаю, что нашел проблему (неожиданный жетон амперсанда, наконец, зажег лампочку в моей голове). Я добавил ответ на эту страницу, если он может помочь кому-то еще в будущем.
2 ответа
Для меня проблема возникла в результате автоматического кодирования HTML бритвы (таким образом, превращая многие символы в свои &...;
HTML кодированные эквиваленты).
Таким образом, вместо того, чтобы писать @jsonString
Мне нужно было писать @Html.Raw(jsonString)
таким образом, обходя (как я изначально предполагал) любую дальнейшую кодировку, которая может искажать синтаксис json.
Кроме того, я не нашел необходимым добавлять Response.AddHeader("Content-Type","application/json");
линия, хотя я использую $.ajax
вместо $.getJSON
Еще раз спасибо всем за помощь!
У меня была похожая проблема,
Я решил это, заголовок в верхней части .cshtml
файл в WebMatrix
@{
Response.AddHeader("Content-Type","application/json");
}
Еще одна вещь, которую нужно проверить, это то, что ваш JSON проходит проверку. Скопируйте и вставьте свой результат JSON в валидатор JSON и убедитесь, что он прошел. (Вы уже сделали это, я хотел бы, чтобы будущие читатели этого вопроса увидели это).
Вот пример кода, который вы можете получить с помощью JSON
$.getJSON("/AJAX Pages/Compute_Calendar_Events.cshtml").done(function(result){
alert("Success!");
console.log(result);
}).fail(function(){
alert("Error loading");
});