我正在尝试新的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);
}
我做错了什么想法?
答案 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()
,明确设置请求的type
,dataType
等?
答案 3 :(得分:0)
响应中的内容类型是什么?不是你要求的,或者在dataType parm上指定,但是作为响应的内容类型发送回的服务器是什么(来自fiddler)