【发布时间】:2009-03-04 21:27:30
【问题描述】:
我有以下 jQuery 代码:
$.ajax({
type: "POST",
url: "Services/MyService.asmx/Select",
dataType: "json",
data: "{'data':'test'}",
contentType: "application/json; charset=utf-8",
success: function(msg){
alert(msg);
},
error: function(xhr){ alert(xhr.statusText);}
});
对该方法的调用返回以下内容:
"{"FirstName":"James"}"
当我取回值时,我的警报会返回完整的 json 字符串。如果我尝试做alert(msg.FirstName),我会得到“未定义”。
我见过很多使用 getJSON() 方法的例子;但是,我还没有看到将其用于 POST 动词的方法。谁能指出我出错的正确方向?根据 jquery 文档,返回值应该是相同的 dataType (json) 所以我不确定我缺少什么。
编辑: 我查看了我的服务,它与我在返回字符串的方法签名方面找到的示例相匹配。我还确认响应类型是 application/json。
编辑2: 更新了响应以包含外部引号。我还使用自定义 JavaScriptConverter 来进行 JSON 序列化。自定义转换器只获取我的对象属性(在本例中为 FirstName)并将其加载到 Dictionary 集合中,ASP.Net AJAX Extensions v1.0 可以轻松序列化该集合。
编辑3:
查看我在使用 eval() 时遇到的问题(它导致了 Expected ";" 错误),我注意到 json 属性名称也包含在引号中。一旦我从属性名称(而不是值)中删除引号, eval() 就会再次起作用。现在调查这个问题的服务器端。
【问题讨论】:
-
一旦您解决了转义/引用问题,您就不需要额外的手动 eval()。 jQuery 会自动为你做这些。
-
遗憾的是,不管有没有转义,我仍然需要 eval() 语句。我不喜欢它,但它可以工作,而且它是在匿名函数的上下文中,所以我觉得可以使用它,直到我可以将客户端升级到 .Net 3.5。