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

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. 调试建议

  1. 打开浏览器开发者工具(F12)→ Network标签,查看选择Brand时是否有请求发送到GetVolumes接口:
    • 没有请求:检查jQuery是否加载、下拉框ID是否匹配
    • 请求返回500:查看服务器日志,排查SQL或连接错误
    • 请求返回200但无数据:在Oracle客户端测试SQL语句,确认传入有效BCodeID时能返回数据
  2. 在GetVolumes方法加断点,查看BCodeID是否正确接收,执行SQL后是否有数据返回

内容的提问来源于stack exchange,提问作者Bouros Ioannis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:03:55