ASP.NET Core中Razor+jQuery级联下拉框无响应问题求助
问题分析与解决方案
看起来你的级联下拉框问题主要集中在前端选择器匹配、URL拼接错误,以及后端SQL安全和连接管理这几个点上,我帮你逐一梳理并给出修复方案:
1. 前端View层的核心错误
(1)下拉框ID大小写不匹配
你的第二个下拉框在View里定义的ID是小写的vCodeID,但jQuery代码里用的是大写的$("#VCodeID")——大小写不匹配导致JS找不到元素,自然无法更新内容。
把View里的下拉框ID统一改成大写:
<select class="form-control" id="VCodeID" name="VCodeID" asp-for="VCodeID" asp-items="@(new SelectList(string.Empty, "VCodeID", "VDescr"))"></select>
(2)URL拼接语法错误
原JS里的URL拼接有语法错误:
var url = '@Url.Content("~/"' + "Materials/GetVolumes";
改成更简洁且正确的写法,推荐用Url.Action自动生成路由:
var url = '@Url.Action("GetVolumes", "Materials")';
(3)优化JS代码(合并冗余逻辑+增加错误调试)
把两个$(document).ready()合并,同时增加错误捕获,方便调试:
<script src="~/lib/jquery/dist/jquery.js"></script> <script type="text/javascript"> $(document).ready(function () { // 初始化Volume下拉框 $("#VCodeID").html("<option value='0'>--Select Volume--</option>"); // Brands下拉框变更事件 $("#BCodeID").change(function () { var selectedBrandId = $(this).val(); var url = '@Url.Action("GetVolumes", "Materials")'; if (selectedBrandId == 0) { // 选择默认选项时重置Volume下拉框 $("#VCodeID").html("<option value='0'>--Select Volume--</option>"); return; } $.getJSON(url, { BCodeID: selectedBrandId }, function (data) { var items = '<option value="0">--Select Volume--</option>'; $.each(data, function (i, volume) { items += `<option value="${volume.value}">${volume.text}</option>`; }); $("#VCodeID").html(items); }).fail(function(jqXHR, textStatus, errorThrown) { // 调试用:打印错误到控制台 console.error("加载Volume数据失败: ", textStatus, errorThrown); }); }); }); </script>
2. 后端Controller层的修复
(1)解决SQL注入风险+修正SQL语句
原代码直接拼接BCodeID到SQL里,存在严重的SQL注入风险,同时SQL里ORDER BY前少了空格,可能导致语法错误:
// 修正后的参数化SQL public JsonResult GetVolumes(Int64? BCodeID) { if (BCodeID == null) { throw new ArgumentNullException(nameof(BCodeID)); } List<Volume> volumelist = new List<Volume>(); volumelist.Insert(0, new Volume { VCodeID = 0, VDescr = "--Select Volume--" }); // 用using自动释放数据库连接,避免连接泄漏 using (var con = new OracleConnection(GetConString.ConString())) { con.Open(); string v_query = @"SELECT DISTINCT IG.CODEID, IG.DESCR FROM MATERIAL M INNER JOIN ITEMGROUP IG ON M.IGPID = IG.CODEID INNER JOIN ITEMCATEGORY IC ON '3' || SUBSTR(M.ICTID, 3, 2) = IC.CODEID WHERE M.ICTID LIKE('3%') AND IC.CODEID = :BCodeID ORDER BY CODEID"; OracleCommand v_cmd = new OracleCommand(v_query, con); // 参数化传递,避免SQL注入 v_cmd.Parameters.Add(":BCodeID", OracleDbType.Int64).Value = BCodeID; OracleDataAdapter v_da = new OracleDataAdapter(v_cmd); DataTable v_dt = new DataTable(); v_da.Fill(v_dt); foreach (DataRow v_dr in v_dt.Rows) { volumelist.Add(new Volume { VCodeID = Convert.ToInt64(v_dr["codeID"]), VDescr = v_dr["descr"].ToString() }); } } return Json(new SelectList(volumelist, "VCodeID", "VDescr")); }
(2)统一数据库连接管理
所有数据库操作都用using包裹OracleConnection,确保连接被自动释放,避免连接池耗尽。
3. Model层的小问题
Volume类里的BCodeID类型是int,但Brands里的BCodeID是Int64,类型不匹配可能导致关联查询异常,改成一致的Int64:
public class Volume { [Key] [Column("VCODEID")] public Int64 VCodeID { get; set; } [Column("VDESCR")] public string VDescr { get; set; } [Column("BDESCR")] // 注意:确认数据库列名是否正确对应Brand的CODEID public Int64 BCodeID { get; set; } }
4. 调试建议
- 打开浏览器开发者工具(F12)→ Network标签,查看选择Brand时是否有请求发送到
GetVolumes接口:- 没有请求:检查jQuery是否加载、下拉框ID是否匹配
- 请求返回500:查看服务器日志,排查SQL或连接错误
- 请求返回200但无数据:在Oracle客户端测试SQL语句,确认传入有效
BCodeID时能返回数据
- 在
GetVolumes方法加断点,查看BCodeID是否正确接收,执行SQL后是否有数据返回
内容的提问来源于stack exchange,提问作者Bouros Ioannis
相关产品推荐
相关产品推荐

