Странное поведение JQuery $ .Ajax () с использованием типа данных JSONP: как это исправить? - PullRequest
3 голосов
/ 26 января 2011

Это рабочий запрос 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);
    }
});

Теперь, если вы обменяетесь успешно: для jsonpCallback: onвторой запрос вызывает функцию 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);
}

Ошибка отмечена в комментариях.Очевидно, ASP.NET MVC вызывает для вас ExecuteResult, поэтому, вызывая его вручную, дважды добавлял данные к результату.

1 Ответ

2 голосов
/ 26 января 2011

Мой ответ из комментариев:

Вы уверены, что ваш ответ JSONP не включает myFunctionName в вывод дважды?

...