【问题标题】:Strange JQuery $.Ajax() behavior using JSONP datatype: How to fix?使用 JSONP 数据类型的奇怪 JQuery $.Ajax() 行为:如何修复?
【发布时间】: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


【解决方案1】:

我在 cmets 的回答:

你确定你的 JSONP 响应不是 在输出中包括myFunctionName 两次?

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 2013-08-03
    • 1970-01-01
    • 2018-07-16
    • 2023-03-09
    • 2011-08-18
    • 2018-02-12
    相关资源
    最近更新 更多