ASP.NET中AJAX调用WebMethod返回数据出现undefined问题
AJAX调用ASMX WebMethod返回undefined的问题解决
核心原因
你后端返回的是数组格式的JSON([{"ItemType":"GOLD"}]),但前端直接尝试访问data.ItemType——数组本身没有ItemType属性,自然返回undefined。
解决步骤
1. 前端代码修正
因为返回的是数组,需要先访问数组元素,再取对应属性:
$("#btnGetStock").click(function (e) { var dataToSend = JSON.stringify({ labelno: document.getElementById("<%=txt_labelno.ClientID%>").value }); $.ajax({ type: "POST", url: "FillGridMethod.asmx/QuotationList", data: dataToSend, contentType: "application/json; charset=utf-8", // 必须添加,确保参数正确绑定 dataType: "json", success: function (data) { // 兼容两种返回格式:规范WebMethod返回的d属性,或手动输出的原始数据 var responseData = data.d || data; if (responseData.length > 0) { alert(responseData[0].ItemType); // 访问数组第一个元素的ItemType $("#lbl_type").val(responseData[0].ItemType); } } }); });
2. 后端代码规范优化
你的后端写法不符合ASMX WebMethod的规范,手动写Response.Write容易引发问题,应该直接返回数据,让ASMX自动处理序列化:
[WebMethod(EnableSession = true)] public List<QuotationModel> QuotationList(string labelno) { // 修正Session判断:先判断是否为null,再调用ToString(),避免空引用异常 if (HttpContext.Current.Session["BranchId"] == null) { HttpContext.Current.Response.Redirect("Index.aspx"); return null; } var quotation = new List<QuotationModel>(); string constr = cn.ConnectionString; // 使用using包裹所有IDisposable对象,避免资源泄漏 using (SqlConnection con = new SqlConnection(constr)) { string qryFillGrid = "SELECT ItemType FROM tbl_StockRunning stock"; using (SqlCommand cmd = new SqlCommand(qryFillGrid, con)) { con.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { quotation.Add(new QuotationModel { ItemType = dr["ItemType"].ToString().Trim() }); } } } } // 直接返回集合,ASMX会自动序列化为JSON并包裹在d属性中 return quotation; }
关键注意点
- ASMX WebMethod默认会把返回数据包裹在
d属性中(出于安全考虑),所以前端需要先获取data.d再处理数据。 - POST请求必须设置
contentType: "application/json; charset=utf-8",同时用JSON.stringify()序列化请求参数,否则后端可能无法正确接收labelno参数。
内容的提问来源于stack exchange,提问作者s.k.Soni
相关产品推荐
相关产品推荐

