$ .getJSON()在jQuery 1.5中不能与ASP.NET MVC2一起使用

时间:2011-02-03 16:57:19

标签: json asp.net-mvc-2 jquery-1.5

我正在尝试新的jQuery 1.5,它在我的应用程序中打破了一些东西。我调用一个生成JSON的动作,但是出错了并导致脚本停止。根据Fiddler和Firebug的说法,该动作确实返回了JSON数据。我没有提供JSON数据,但根据JSONLint数据是有效的。

请注意,这在jQuery 1.4.4中按预期工作。

我注意到的第一件事是网址:http://localhost:3219/News/GetAllNewsArchives?callback=jQuery15033185029088076134_1296751219270&_=1296751219672

脚本:

// Dropdown box for past articles
$("#article-select").ready(function() {
    $.ajaxSetup({ cache: false });
    $.getJSON('/News/GetAllNewsArchives', null, function(json) {
        var items = "<option value=''>(Select)</option>";
        $.each(json, function(i, item) {
            items += "<option value='" + item.Id + "'>" + subject + "</option>";
        });
        $("#article-select").html(items);
    });
});

动作:

    public ActionResult GetAllNewsArchives()
    {
        return Json(newsRepository.GetAllNewsArchives(), JsonRequestBehavior.AllowGet);
    }

我做错了什么想法?

4 个答案:

答案 0 :(得分:3)

好的,我切换到$ .ajax电话,我也遇到了同样的错误:

// Dropdown box for past articles
$("#article-select").ready(function() {
    $.ajax({
        cache: false,
        type: "POST",
        dataType: "json",
        url: "/News/GetAllNewsArchives",
        success: function(json) {
            var items = "<option value=''>(Select)</option>";
            $.each(json, function(i, item) {
                items += "<option value='" + item.Id + "'>" + subject + "</option>";
            });
            $("#article-select").html(items);
        }
    });

但是,我注意到了$.ajax() documentation上的一些内容。

  

从jQuery 1.5开始,jQuery可以将dataType从Content-Type标头中收到的内容转换为您需要的内容。例如,如果要将文本响应视为XML,请对dataType使用“text xml”。您还可以发出JSONP请求,将其作为文本接收,并由jQuery解释为XML:“jsonp text xml”。类似地,诸如“jsonp xml”之类的速记字符串将首先尝试从jsonp转换为xml,如果失败,则从jsonp转换为text,然后从text转换为xml。

我将数据类型从dataType: "json"更改为dataType: "text json",然后才有效。

现在,我只是不明白为什么不同。 json期望的不同之处是什么?

答案 1 :(得分:2)

在jquery 1.5源代码中,这是检测内容类型的代码。

// Remove auto dataType and get content-type in the process
while( dataTypes[ 0 ] === "*" ) {
    dataTypes.shift();
    if ( ct === undefined ) {
        ct = jXHR.getResponseHeader( "content-type" );
    }
}

// Check if we're dealing with a known content-type
if ( ct ) {
    for ( type in contents ) {
        if ( contents[ type ] && contents[ type ].test( ct ) ) {
            dataTypes.unshift( type );
            break;
        }
    }

如果将dataType设置为“json”,则前面的代码将使ct保持为undefined。 这就是它无法按预期工作的原因。 这是jQuery 1.5中的一个问题,因为它破坏了与以前版本的jQuery的兼容性。

因此,您应将dataType设置为“text json”或删除dataType,以便使用默认值。

默认值:

    converters: {

        // Convert anything to text
        "* text": window.String,

        // Text to html (true = no transformation)
        "text html": true,

        // Evaluate text as a json expression
        "text json": jQuery.parseJSON,

        // Parse text as xml
        "text xml": jQuery.parseXML
    }

答案 2 :(得分:0)

出于某种原因,它将您的请求解释为JSONP。在Firebug中,检查$ .ajaxSettings的值,并确保某些内容不会将其dataType默认为jsonp

您是否尝试过直接使用$.ajax(),明确设置请求的typedataType等?

答案 3 :(得分:0)

响应中的内容类型是什么?不是你要求的,或者在dataType parm上指定,但是作为响应的内容类型发送回的服务器是什么(来自fiddler)