Почему мой вызов $.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("~/");
    }
}

Очень важно отметить пару вещей:

  1. Я не получаю серверную ошибку или код ошибки.
  2. Я записал вывод в простой файл.txt для проверки содержимого, и, вставив его в jsonLint (находится здесь: http://jsonlint.com/), я легко смог определить, что это действительно допустимый синтаксис json,
  3. Я по-прежнему всегда получаю предупреждающее сообщение, которое запускается только под опцией "error: function()" вызова $.ajax.
  4. Я не получаю пустого пространства ни до, ни после всего jsonString (не то, что это, вероятно, имеет значение).
  5. Я нахожусь в среде WebMatrix, C#, asp.net-webpages.
  6. У меня есть только два подозрения: 1) dataType и / или contentType установлены неправильно, или 2) в последний раз, когда мне пришлось использовать ajax для json (для целевого файла.json), мне пришлось изменить настройку в "IIS Express" однако, чтобы он мог получать данные из файлов json, я подумал, что это необходимо только в том случае, если на самом деле используется ajax для анализа "файла" json, а не только данных json. Кроме того, независимо от того, куда я смотрю, я не могу найти этот ресурс больше.
  7. Значения параметров 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");
});
Другие вопросы по тегам