【问题标题】:Why won't my $.ajax call return a json object from a cshtml file?为什么我的 $.ajax 调用不会从 cshtml 文件返回 json 对象?
【发布时间】:2013-05-20 14:53:22
【问题描述】:

我有一个使用 ajax 来尝试返回 json 对象的 jquery,但我不是 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) 上次我不得不对 json 使用 ajax(定位一个实际的 .json 文件)我必须更改“IIS Express”中的设置以允许它从 json 文件接收数据,但是,我认为只有在实际使用 ajax 解析 json“文件”时才需要这样做,而不仅仅是json数据。另外,无论我在哪里看,似乎都找不到这个资源了。
  7. textStatus 和 error 参数值为:textStatus: parsererror error: SyntaxError: Unexpected token & 但这似乎并没有在我脑海中引发任何危险信号,因为我知道 json 语法自己检查没问题。

感谢大家的帮助。我相信我已经找到了问题(意外的 & 符号终于让我的脑海中出现了一个灯泡)。我已将答案添加到此页面,以防将来可能对其他人有所帮助。

【问题讨论】:

  • 报错说明是服务器出错,不是浏览器出错。
  • contentTypetype: "GET"无关,因为没有内容(contentType指的是表单值,dataType指的是响应)。
  • 你应该使用 Json.Write 来生成 JSON,。你不应该自己构建它:Json.Write(db.Query(selectQueryString), Response.Output)
  • @MikeBrind 我会试一试,但我讨厌弄乱正在运行的代码……哈哈。无论如何,我认为Json.Write 直接写入页面?如何保留与我自己构建的相同的名称/值对?
  • @Barmar 谢谢你告诉我。是的,我真的不知道 contentType 是什么。我什至对 dataType 所做的一切都不是 100% 清楚。

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


【解决方案1】:

我也遇到过类似的问题,

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

【讨论】:

  • 正如我所说,我使用 JSONLint 来确保 json 语法有效,并且确实如此。
  • 我现在正在尝试你的答案。
  • $.getJSON 自动假定 JSON 内容类型,它不关心标头。
  • @Barmar 对,我怀疑 ASP.NET 可能会因为未指定的 ContentType(假设 text/html)而添加额外的代码。我真的不怀疑客户端。不过评论很好。
  • +1 用于使用.done 并向我展示如何使用$.getJSON 获得async: false 的等价物(如果我确实做对了)。有时我会忽略结合良好的简单方法!
【解决方案2】:

对我来说,问题出在 razor 的自动 HTML 编码(因此将许多字符转换为它们的 &...; HTML 编码等效项)。

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

另外,我发现没有必要添加 Response.AddHeader("Content-Type","application/json"); 行,即使我使用的是 $.ajax 而不是 $.getJSON

再次感谢大家的帮助!

【讨论】:

  • 顺便说一句,您可以在 Razor 中构建整个字符串,而不是使用字符串连接。您已经在模板引擎中,不妨使用它:)
  • @BenjaminGruenbaum 我不知道你在说什么,哈哈,我想举个例子!
  • @BenjaminGruenbaum 实际上,也许我应该说,我不知道我将如何从这种替代方案中受益。
  • tipranks.com/javascripts/articles.cshtmlpaste.ubuntu.com/5684036 驱动,看看代码有多简单,当我编辑 JSON 时,我得到了正确的语法指示,并且不必处理转义和其他东西。值得一提的是,这与用户输入无关,都是我们的输入。此外,在客户端使用 Mustache 进行消毒。
猜你喜欢
  • 2011-06-28
  • 2020-02-05
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多