ASP.NET中jQuery .post调用WebService返回对象为null(实际非空)求助
哥们,我太懂你这种看着Firebug里明明有数据,但代码里一访问就是null的憋屈了!我之前也踩过这个ASMX+jQuery的坑,给你捋捋最可能的几个原因,按顺序排查大概率能解决:
1. WebService的关键配置没加全,导致返回格式不对
ASP.NET的ASMX WebService默认是返回XML的,哪怕你代码里返回了对象,它也会硬给你转成XML。而且如果没开AJAX调用权限,服务端甚至会直接拒绝你的请求。
必须给WebService类和方法加上这几个特性:
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] // 这个是核心!没加的话AJAX调用直接失效 public class AoP : System.Web.Services.WebService { [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] // 强制返回JSON格式 public ListingManager GetListingManagerByID(int ListingMgrID) { // 执行存储过程、封装对象的逻辑 } }
2. 你忽略了ASMX的JSON封装层——
response.d 这是微软为了安全加的坑!ASMX返回的JSON数据会被自动包在一个d属性里,你直接访问响应对象当然拿不到数据,得先取response.d才行。
比如你原来的回调应该改成这样:
$(".listingManagerEdit").live("click", function () { var listingId = $(this).closest(".listingRow").data("listingmgrid"); // 假设你是这么获取ID的 $.post("/WebServices/AoP.asmx/GetListingManagerByID", JSON.stringify({ ListingMgrID: listingId }), function (response) { // 重点在这!必须取response.d var manager = response.d; if (manager) { // 现在就能正常访问属性了 console.log(manager.Name); } }, "json" // 明确告诉jQuery要解析成JSON ); });
如果还是有问题,建议换成$.ajax更明确地配置参数,比如指定contentType和dataType,避免自动解析出错:
$.ajax({ url: "/WebServices/AoP.asmx/GetListingManagerByID", type: "POST", contentType: "application/json; charset=utf-8", // 必须指定,告诉服务端你发的是JSON data: JSON.stringify({ ListingMgrID: listingId }), dataType: "json", success: function (response) { var manager = response.d; // 处理数据 } });
3. 参数名大小写不匹配
ASMX的参数是大小写敏感的!你WebService方法里的参数是ListingMgrID,那你JSON.stringify里的键名必须完全一致,不能写成listingMgrID或者其他拼写错误,不然服务端接收不到参数,返回空数据,你自然拿到null。
4. 其他小概率排查点
- 跨域问题:如果页面和WebService不在同一个域名/端口/协议下,会有跨域限制,但你Firebug能看到响应,这个可能性不大;
- 权限问题:WebService所在目录有没有登录限制?如果需要身份凭证,你的AJAX请求没带的话,也可能返回空数据。
总结一下,90%的概率是没加ScriptService特性或者忘记取response.d,先查这两个!
内容的提问来源于stack exchange,提问作者BKahuna
相关产品推荐
相关产品推荐

