我在从我的网站之一检索 JSONP 数据时遇到问题。现场 A 数据由以下 MVC2 Controller 操作提供:
public JsonResult JsonList(string key) {
var consultants = rep.FindAll().Where(c => c.IsActive).Select(c => new ConsultantJsonItem { Firstname = c.Firstname, Surname = c.Surname });
return Json(consultants, "application/json");
}
在站点 B 上,我使用 jQuery 检索 JSON,如下所示:
$.ajax({
url: 'http://www.siteA.com/controller/jsonaction/',
dataType: 'JSONP',
crossDomain: true,
success: function (json) {
alert("success"); // THIS DISPLAYS
alert(json); // THIS IS ALWAYS EMPTY
},
error: function (xhr, status, error) {
alert(status); // NOT CALLED
}
});
我可以在 Firebug 控制台中看到响应以 200 代码正确完成,并且我可以看到响应的内容长度为 11516 字节,但响应选项卡完全是空的,jQuery 不会给我任何数据一起工作。
谁能告诉我这是为什么?
注意:该网站使用的是 jQuery 1.4.2
最佳答案
您返回的 JSON 与 JSONP 不同:
return Json(consultants, "application/json");
事实上,您在客户端设置 dataType: 'JSONP'
只是您需要完成的工作的一半。后半部分在服务器上。
查看 following answer它说明了如何创建自定义 JsonpResult
,它将使用回调查询字符串参数将响应包装到 JSONP 中。
所以:
public class JsonpResult : ActionResult
{
private readonly object _obj;
public JsonpResult(object obj)
{
_obj = obj;
}
public override void ExecuteResult(ControllerContext context)
{
var serializer = new JavaScriptSerializer();
var callbackname = context.HttpContext.Request["callback"];
var jsonp = string.Format("{0}({1})", callbackname, serializer.Serialize(_obj));
var response = context.HttpContext.Response;
response.ContentType = "application/json";
response.Write(jsonp);
}
}
然后:
public ActionResult JsonList(string key)
{
var consultants = rep.FindAll().Where(c => c.IsActive).Select(c => new ConsultantJsonItem { Firstname = c.Firstname, Surname = c.Surname });
return new JsonpResult(consultants);
}
在客户端:
$.ajax({
url: 'http://www.siteA.com/controller/jsonaction/',
jsonp: 'callback',
dataType: 'jsonp',
success: function (json) {
alert(json);
}
});
关于jquery - JSONP请求成功,但没有返回任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9620305/