为什么我的$ .ajax调用不会从cshtml文件返回一个json对象?

时间:2013-05-20 14:53:23

标签: c# ajax json webmatrix asp.net-webpages

我有这个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和错误参数值为: textStatus:parsererror错误:SyntaxError:意外的令牌& 但是这似乎没有在我脑海中抛出任何红旗,因为我知道json语法本身可以检查出来。
  8. 感谢所有人的帮助。我相信我已经找到了这个问题(意想不到的&符号终于让我的头脑中出现了一个灯泡)。我已经在此页面中添加了答案,以防将来可能对其他人有所帮助。

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,

我已经通过标题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");
});

答案 1 :(得分:1)

对我来说,问题是由于razor的自动HTML编码(因此将许多字符转换为他们的&...; HTML编码的等价物)。

因此,我不需要编写@jsonString而是编写@Html.Raw(jsonString),从而绕过(如我原先的意图)任何可能扭曲json语法的进一步编码。

此外,即使我使用Response.AddHeader("Content-Type","application/json");代替$.ajax

,我也没有必要添加$.getJSON行。

再次感谢大家的帮助!