【发布时间】:2011-01-27 00:45:24
【问题描述】:
这是一个有效的 JSON 请求:
$.ajax({
type: "POST",
url: "GetJSON",
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (j) {
myFunctionName(j);
}
});
还有另一个几乎相同的 JSONP 请求也有效:
$.ajax({
type: "GET",
url: "GetJSONP",
data: {},
contentType: "application/json; charset=utf-8",
dataType: "jsonp",
success: function (j) {
myFunctionName(j);
}
});
现在,如果您将 success: 换成 jsonpCallback: 在第二个请求中,它会调用函数 myFunctionName 两次。来自服务器的结果是 myFunctionName( [jsondata] ) 其中 [jsondata] 是 json 编码数据。
$.ajax({
type: "GET",
url: "GetJSONP",
data: {},
contentType: "application/json; charset=utf-8",
dataType: "jsonp",
jsonpCallback: "myFunctionName"
});
在调用 myFunctionName 两次的第三个代码示例中我做错了什么?
答案:
在 ASP.NET MVC 3 中,我使用了这个:
public class JsonpResult : ActionResult
{
public override void ExecuteResult( ControllerContext c)
}
还有这个:
public static JsonpResult Jsonp(this Controller c, object d)
{
JsonpResult r = new JsonpResult();
r.Data = d;
// r.ExecuteResult(c.ControllerContext); <== mistake
return r;
}
还有这个:
public JsonpResult GetJSONP()
{
var service = new Service();
var data = service.Getdata();
return this.Jsonp(data);
}
错误已在 cmets 中注明。显然 ASP.NET MVC 会为您调用 ExecuteResult,因此手动调用它会将数据两次添加到结果中。
【问题讨论】:
-
您确定您的 JSONP 响应没有在输出中两次包含
myFunctionName吗? -
是什么触发了 AJAX 请求?第三个示例似乎是一个简单的测试
-
@Spencer:就是这样。将其发布为答案。显然在 ASP.NET MVC 3 中,ActionResult 会为您调用 ExecuteResult。
-
Zim:啊,提到 ASP.NET MVC 会很重要,但很高兴我能提供帮助。
标签: json jquery asp.net-mvc-3 jsonp