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

ASP.NET WebForms三级DropDownList选中值丢失及控件异常求助

控件代码

产品下拉框

<asp:DropDownList id="slctproduct" runat="server" name="select" class="form-control form-control-primary"  onchange="selectcategory(); return false;"> </asp:DropDownList>

分类下拉框

<asp:DropDownList id="slctpartcategory" runat="server" class="form-control form-control-primary" onchange="selectpart(); return false;" ></asp:DropDownList>

零件下拉框

<asp:DropDownList id="slctpart" runat="server" name="select" class="form-control form-control-primary" ></asp:DropDownList>

当前联动代码

产品→分类 前端逻辑

function selectcategory() {
    var product = document.getElementById('<%= slctproduct.ClientID %>');
    // Fetch and populate part categories based on the selected product
    $.ajax({
        type: "POST",
        url: "RNI_Agent_PartStockReport.aspx/RNI_Fetch_PartCategoryForCN",
        data: "{ 'P': { 'RNI_FK_CN_PartCategory': '" + product.value + "' } }",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (r) {
            var ddlProducts2 = $("[id*=slctpartcategory]");
            ddlProducts2.empty().append('<option selected="selected" value="-1">Select Part Category</option>');
            $.each(r.d, function () {
                ddlProducts2.append($("<option></option>").val(this['Value']).html(this['Text']));
            });
        }
    }); 
}

产品→分类 后端逻辑(C#)

public static List<ListItem> RNI_Fetch_PartCategoryForCN(Properties P)
{
    using (cmd = new SqlCommand())
    {
        List<ListItem> type = new List<ListItem>();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "sp_Fetch_PartcategoryForCN";
        cmd.Connection = Getconnected.getconnecting();
        cmd.Parameters.AddWithValue("@Product", P.RNI_FK_CN_PartCategory);
        //cmd.Parameters.AddWithValue("@category", P.RNI_FK_SelectedPartCategory); 
        using (sdr = cmd.ExecuteReader())
        {
            while (sdr.Read())
            {
                type.Add(new ListItem
                {
                    Value = sdr[0].ToString(),
                    Text = sdr[1].ToString()
                });
            }
        }
        return type;
    }
}

分类→零件 前端逻辑

function selectpart() {
    var partcategory = document.getElementById('<%= slctpartcategory.ClientID %>');
    // Check if any of the inputs are empty or null
    $.ajax({
        type: "POST",
        url: "RNI_Agent_PartStockReport.aspx/RNI_Fetch_Part",
        data: "{ 'P': { 'FK_Part': '" + partcategory.value + "' } }",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (r) {
            var ddlProducts = $("[id*=slctpart]");
            ddlProducts.empty().append('<option selected="selected" value="-1">Select Part</option>');
            $.each(r.d, function () {
                ddlProducts.append($("<option></option>").val(this['Value']).html(this['Text']));
            });    
        }
    });
}

分类→零件 后端逻辑(C#)

[WebMethod]
public static List<ListItem> RNI_Fetch_Part(Properties P)
{
    using (cmd = new SqlCommand())
    {
        List<ListItem> type = new List<ListItem>();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "sp_Fetch_PartsfromCategory";
        cmd.Connection = Getconnected.getconnecting();
        cmd.Parameters.AddWithValue("@category", P.FK_Part);
        using (sdr = cmd.ExecuteReader())
        {
            while (sdr.Read())
            {
                type.Add(new ListItem
                {
                    Value = sdr[0].ToString(),
                    Text = sdr[1].ToString()
                });
            }
        }
        return type;
    }
}

问题原因与修复方案

核心原因

前端代码中使用的模糊选择器[id*=slctpart]会匹配所有ID包含"slctpart"字符串的控件,而分类下拉框的ID是slctpartcategory,恰好包含"slctpart",导致调用selectpart()时,同时修改了零件下拉框和分类下拉框,把分类下拉框的选项替换成了零件选项,出现两个零件下拉框的异常。

修复步骤

将模糊选择器替换为精确匹配服务器控件ClientID的选择器,确保只操作目标下拉框:

修改后的「产品→分类」前端函数

function selectcategory() {
    var product = document.getElementById('<%= slctproduct.ClientID %>');
    // 精确获取分类下拉框
    var ddlCategory = $('#<%= slctpartcategory.ClientID %>');

    $.ajax({
        type: "POST",
        url: "RNI_Agent_PartStockReport.aspx/RNI_Fetch_PartCategoryForCN",
        data: "{ 'P': { 'RNI_FK_CN_PartCategory': '" + product.value + "' } }",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (r) {
            ddlCategory.empty().append('<option selected="selected" value="-1">Select Part Category</option>');
            $.each(r.d, function () {
                ddlCategory.append($("<option></option>").val(this['Value']).html(this['Text']));
            });
        }
    }); 
}

修改后的「分类→零件」前端函数

function selectpart() {
    var partcategory = document.getElementById('<%= slctpartcategory.ClientID %>');
    // 精确获取零件下拉框
    var ddlPart = $('#<%= slctpart.ClientID %>');

    $.ajax({
        type: "POST",
        url: "RNI_Agent_PartStockReport.aspx/RNI_Fetch_Part",
        data: "{ 'P': { 'FK_Part': '" + partcategory.value + "' } }",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (r) {
            ddlPart.empty().append('<option selected="selected" value="-1">Select Part</option>');
            $.each(r.d, function () {
                ddlPart.append($("<option></option>").val(this['Value']).html(this['Text']));
            });    
        }
    });
}

额外优化建议

  • 可以提前缓存控件对象,避免每次调用函数时重复查找DOM元素
  • 若需要保留分类下拉框的选中状态,在填充零件下拉框时不要对分类下拉框做任何修改(修复选择器后即可实现)

内容的提问来源于stack exchange,提问作者M Umer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:54:50