【发布时间】: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("~/");
}
}
注意以下几点非常重要:
- 我没有收到服务器端错误或错误代码。
- 我已将输出写入一个简单的 .txt 文件以测试其内容,并将其粘贴到 jsonLint(可在此处找到:http://jsonlint.com/)我很容易确定这确实是有效的 json 语法。
- 我仍然总是收到仅在 $.ajax 调用的“error: function()”选项下运行的警报消息。
- 我在整个 jsonString 之前或之后都没有空格(这可能并不重要)。
- 我在 WebMatrix、C#、asp.net-webpages 环境中。
- 我唯一的两个怀疑是 1) dataType 和/或 contentType 设置不正确,或者 2) 上次我不得不对 json 使用 ajax(定位一个实际的 .json 文件)我必须更改“IIS Express”中的设置以允许它从 json 文件接收数据,但是,我认为只有在实际使用 ajax 解析 json“文件”时才需要这样做,而不仅仅是json数据。另外,无论我在哪里看,似乎都找不到这个资源了。
- textStatus 和 error 参数值为:textStatus: parsererror error: SyntaxError: Unexpected token & 但这似乎并没有在我脑海中引发任何危险信号,因为我知道 json 语法自己检查没问题。
感谢大家的帮助。我相信我已经找到了问题(意外的 & 符号终于让我的脑海中出现了一个灯泡)。我已将答案添加到此页面,以防将来可能对其他人有所帮助。
【问题讨论】:
-
报错说明是服务器出错,不是浏览器出错。
-
而
contentType与type: "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