簡體   English   中英

為什么我的$ .ajax調用不會從cshtml文件返回一個json對象?

[英]Why won't my $.ajax call return a json object from a cshtml file?

我有這個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,但它沒有改變任何行為)。

這是我指向AJAX的cshtml頁面:

@{
    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. 我仍然總是收到僅在$ .ajax調用的“error:function()”選項下運行的警報消息。
  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語法本身可以檢查出來。

感謝大家的幫助。 我相信我已經找到了這個問題(意想不到的&符號終於讓我的頭腦中出現了一個燈泡)。 我已經在此頁面中添加了答案,以防將來可能對其他人有所幫助。

我有類似的問題,

我已經通過標題WebMatrix中.cshtml文件頂部的標題解決了這個問題

@{
        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");
});

對我來說,問題是由於剃刀的自動HTML編碼(因此將許多字符轉換為他們的&...; HTML編碼的等價物)。

因此,我不需要編寫@jsonString而是編寫@Html.Raw(jsonString)從而繞過(如我原先的意圖)任何可能扭曲json語法的進一步編碼。

另外,我沒有發現有必要添加Response.AddHeader("Content-Type","application/json"); 雖然我使用的是$.ajax而不是$.getJSON

再次感謝大家的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM