jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON解决办法

在WEB项目中,经常会使用到jQuery进行AJAX请求,但是自从使用了.net 3.5以后,以往写的请求语句就有些小问题了,就是返回的始终是xml,而并不是JSON,经过尝试,只需要在$.ajax中加入 contentType: "application/json; charset=utf-8"选项就可以了,这是因为在.net 3.5以后要对contentType进行检查,所以仅仅指定dataType的话.net就不会返回JSON了,那么我们的请求自然也就无法请求到JSON数据了。正确写法就是这样了:

出错代码
 1 var url = "/Services/AccountService.asmx/UserExists";
 2 var userName = $("#txtUserName").val();
 3 $.ajax({
 4     type: "POST",
 5     url: url,
 6     data: '{userName:"'+userName+'"}',
 7     dataType: "json",
 8     success: function (json) {
 9         if (json.d == true) {
10             $("#submit").removeAttr("disabled");
11             return;
12         }
13 
14         $("#submit").attr("disabled", "disabled");
15     }
16 });
更正后代码
 1 var url = "/Services/AccountService.asmx/UserExists";
 2 var userName = $("#txtUserName").val();
 3 $.ajax({
 4     type: "POST",
 5     url: url,
 6     data: '{userName:"'+userName+'"}',
 7     dataType: "json",
 8     contentType: "application/json; charset=utf-8",
 9     success: function (json) {
10         if (json.d == true) {
11             $("#submit").removeAttr("disabled");
12             return;
13         }
14 
15         $("#submit").attr("disabled", "disabled");
16     }
17 });

但是在使用$.get、$.getJSON、$.post时确怎么也得不到JSON数据了,写法如下:

$.get代码
 1 var url = "/Services/AccountService.asmx/UserExists";
 2 var userName = $("#txtUserName").val();
 3 $.get(
 4     url
 5     , { userName: userName }
 6     , function (json) {
 7     if (json.d == true) {
 8         $("#submit").removeAttr("disabled");
 9         return;
10     }
11 
12     $("#submit").attr("disabled", "disabled");
13 },"json");
$.getJSON代码
 1 var url = "/Services/AccountService.asmx/UserExists";
 2 var userName = $("#txtUserName").val();
 3 $.getJSON(
 4     url
 5     , { userName: userName }
 6     , function (json) {
 7     if (json.d == true) {
 8         $("#submit").removeAttr("disabled");
 9         return;
10     }
11 
12     $("#submit").attr("disabled", "disabled");
13 });
$.post代码
 1 var url = "/Services/AccountService.asmx/UserExists";
 2 var userName = $("#txtUserName").val();
 3 $.post(
 4     url
 5     , { userName: userName }
 6     , function (json) {
 7     if (json.d == true) {
 8         $("#submit").removeAttr("disabled");
 9         return;
10     }
11 
12     $("#submit").attr("disabled", "disabled");
13 },'json');

用HttpWatch查看请求返回的数据如下:

显示代码
1 <?xml version="1.0" encoding="utf-8"?>
2 <boolean xmlns="http://tempuri.org/">false</boolean>

看一下jQuery.extend中有关代码:

jQuery.extend
 1 jQuery.extend({
 2 
 3     get: function( url, data, callback, type ) {
 4         // shift arguments if data argument was omited
 5         if ( jQuery.isFunction( data ) ) {
 6             type = type || callback;
 7             callback = data;
 8             data = null;
 9         }
10 
11         return jQuery.ajax({
12             type: "GET",
13             url: url,
14             data: data,
15             success: callback,
16             dataType: type
17         });
18     },
19 
20     getScript: function( url, callback ) {
21         return jQuery.get(url, null, callback, "script");
22     },
23 
24     getJSON: function( url, data, callback ) {
25         return jQuery.get(url, data, callback, "json");
26     },
27 
28     post: function( url, data, callback, type ) {
29         // shift arguments if data argument was omited
30         if ( jQuery.isFunction( data ) ) {
31             type = type || callback;
32             callback = data;
33             data = {};
34         }
35 
36         return jQuery.ajax({
37             type: "POST",
38             url: url,
39             data: data,
40             success: callback,
41             dataType: type
42         });
43     }
44 });

原因就是.net 3.5以后要对contentType进行检查,如果不为json的话,就不会返回json,而get、getJSON、post扩展都再次调用了ajax,但是只传了dataType参数,.net 3.5在检查contentType时发现其不是json,便返回了xml.

来自:http://www.4ucode.com/Study/Topic/2140292
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值