You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:17:08