使用Ajax绑定下拉框时GetCertificate.ID报错问题排查求助
错误原因分析与修复方案
核心错误原因
你在while (ReadData.Read())循环里写的GetCertificate.ID = ...会报错,因为**GetCertificate是类的名称,不是具体的对象实例**。类是一个模板,必须先创建它的实例(比如var certItem = new GetCertificate();),才能给实例的属性赋值。直接操作类的属性只有当属性是static的时候才允许,但你的场景完全不需要静态属性。
其他连带问题(顺便一起修复)
除了这个核心错误,你的代码还有几个和需求不匹配的问题:
- 类定义不符合需求:你需要获取
CODE_VALUE、CODE_DESC、CODE_SUB_VALUE、CODE_SUB_DESC四个字段,但GetCertificate类只定义了ID和Code_Desc两个属性 - SQL查询不完整:你的查询语句
SELECT CODE_DESC from tdc_product1只查了CODE_DESC,既没有ID(所以ReadData["ID"]会抛出列不存在的错误),也没有需求里的另外三个字段 - 资源未释放:数据库连接和DataReader用完后没有关闭,会导致数据库连接泄漏
- 前端拼接逻辑缺失:前端需要把四个字段拼接成
(127,CoilWt,1,KGS)的格式,但当前后端返回的数据结构不支持
修正后的完整代码
1. C# 后端代码
首先调整类定义,新增需要的四个字段,然后修正WebMethod的逻辑:
// 调整类,匹配需求的四个字段 public class CertificateItem { public string CodeValue { get; set; } public string CodeDesc { get; set; } public string CodeSubValue { get; set; } public string CodeSubDesc { get; set; } } [WebMethod] public static List<CertificateItem> GetCertificate() { List<CertificateItem> certificateList = new List<CertificateItem>(); string connStr = ConfigurationManager.ConnectionStrings["conndbprodnew"].ToString(); // 使用using语句自动释放资源(连接、DataReader都会自动关闭) using (OracleConnection objconn = new OracleConnection(connStr)) { // 修改SQL,查询需要的四个字段 string qry = "SELECT CODE_VALUE, CODE_DESC, CODE_SUB_VALUE, CODE_SUB_DESC FROM tdc_product1"; using (OracleCommand objFetchCmd = new OracleCommand(qry, objconn)) { objconn.Open(); using (OracleDataReader ReadData = objFetchCmd.ExecuteReader()) { while (ReadData.Read()) { // 创建类的实例,然后给实例的属性赋值 CertificateItem item = new CertificateItem(); item.CodeValue = ReadData["CODE_VALUE"].ToString(); item.CodeDesc = ReadData["CODE_DESC"].ToString(); item.CodeSubValue = ReadData["CODE_SUB_VALUE"].ToString(); item.CodeSubDesc = ReadData["CODE_SUB_DESC"].ToString(); certificateList.Add(item); } } } } return certificateList; }
2. JavaScript 前端代码
修改前端逻辑,把四个字段拼接成需求的格式:
$(function () { $.ajax({ type: "POST", url: "TDC.aspx/GetCertificate", data: '{}', contentType: "application/json; charset=utf-8", dataType: "json", success: function (r) { var Certific = $("#Certific"); // 直接用ID选择器更高效 Certific.empty().append('<option selected="selected" value="0">Please select</option>'); $.each(r.d, function () { // 拼接成(CODE_VALUE,CODE_DESC,CODE_SUB_VALUE,CODE_SUB_DESC)的格式 var displayText = `(${this.CodeValue},${this.CodeDesc},${this.CodeSubValue},${this.CodeSubDesc})`; // 这里的value可以根据业务需求设置,比如用CodeValue或者拼接后的字符串 Certific.append($("<option></option>").val(this.CodeValue).html(displayText)); }); }, error: function(xhr, status, error) { // 增加错误处理,方便调试 console.error("获取证书数据失败:", error); } }); });
内容的提问来源于stack exchange,提问作者hari
相关产品推荐
相关产品推荐

