【问题标题】:DropDownList's SelectedValue is blank -- why?DropDownList SelectedValue 是空白的——为什么?
【发布时间】:2026-01-28 22:35:01
【问题描述】:

所以我们开始吧。我在“客户”记录上有两个下拉列表。第一个称为“商店”。第二个称为“StoreWarehouse”。当用户选择“Store”值时,将根据他们的选择过滤“StoreWarehouse”下拉列表。我通过 jQuery 和 AJAX 完成了过滤。我正在使用 ListView,它位于 InsertItemTemplate 中。

代码如下:

        function StoreWarehouseLoad(store_ddl) {
        var store_id = store_ddl.options[store_ddl.selectedIndex].value;
        var js = JSON.stringify({ store: store_id });
        $.ajax({
            url: baseUrl + '/AutoComplete/StoreList.asmx/GetStores',
            data: js,
            dataType: "json",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                var ddl = $("#StoreWarehouse_ddl");
                ddl.find('option').remove();
                $(data.d).each(function (index) {
                    ddl.append('<option value="' + this.WarehouseID + '">' + this.WarehouseID + '</option>');
                });
                switch (culture) {
                    case "en-CA":
                        ddl.val(store_id.substring(0, 2) + "I");
                        break;
                    case "en-US":
                        ddl.val('001');
                        break;
                    default:
                        alert("The default warehouse cannot be set because there's something wrong with the current culture...");
                        break;
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                sendErrorEmail(window.location.href, 'Customers.aspx.StoreWarehouseLoad', XMLHttpRequest);
            }
        });
    }

此 JavaScript 调用 Web 服务,该服务根据“Store”下拉列表中的选择加载“StoreWarehouse”下拉列表。这一切都很好。

我的问题是保存记录时。假设我将为客户输入一条新记录,输入所有值(以及 Store 和 StoreWarehouse 下拉列表)。我将单击“保存” - 然后应该将数据保存到数据库中。我的问题是 StoreWarehouse 下拉列表中的 SelectedValue 没有传递到业务层。我什至为 ListView 的“OnInserting”事件捕获了 e.Values,并且 e.Values["DefaultWarehouseId"] 为空。这是我的两个下拉列表的 aspx 页面:

<div class="labelAndTextboxContainer">
                            <div class="labelContainer">
                                <asp:Label CssClass="rightFloat" ID="StoreId_lbl" runat="server" Text="Branch:"></asp:Label><br />
                            </div>
                            <div class="textboxContainer">
                                <asp:DropDownList ID="Store_ddl" runat="server" DataSourceID="StoreDataSource" AppendDataBoundItems="true"
                                    onchange="StoreWarehouseLoad(this);" DataValueField="StoreID" DataTextField="StoreID"
                                    CssClass="leftFloat" Font-Size="Smaller" SelectedValue='<%# Bind("StoreID") %>'>
                                    <asp:ListItem />
                                </asp:DropDownList>
                                <asp:RequiredFieldValidator ID="StoreId_ddl_rfv" runat="server" ControlToValidate="Store_ddl"
                                    Text="*" ForeColor="Red" />
                            </div>
                        </div>
                        <br class="clear" />
                        <div class="labelAndTextboxContainer">
                            <div class="labelContainer">
                                <asp:Label CssClass="rightFloat" ID="StoreWarehouse_lbl" runat="server" Text="Def. Store Warehouse:"></asp:Label><br />
                            </div>
                            <div class="textboxContainer">
                                <asp:DropDownList ID="StoreWarehouse_ddl" runat="server" CssClass="leftFloat" Font-Size="Smaller"
                                    OnDataBound="StoreWarehouse_ddl_OnDataBound" onchange="changeWarehouse();" SelectedValue='<%# Bind("DefaultWarehouseId") %>'
                                    ClientIDMode="Static">
                                </asp:DropDownList>
                            </div>
                        </div>

如您所见,我已将 StoreWarehouse 下拉列表中的“SelectedValue”设置为 。由于某种原因,DefaultWarehouseId 没有在 StoreWarehouse 的下拉列表中获取值。

有趣的是,我可以将以下内容放入上面显示的 JavaScript 中,它会提醒我该下拉列表的选定值:

alert("store warehouse selected is " + $("#StoreWarehouse_ddl").val());

为什么服务器端代码没有获取这个值?

非常感谢!

迈克

【问题讨论】:

    标签: c# asp.net drop-down-menu selectedvalue


    【解决方案1】:

    就像@shiznit123 所说的,这些信息存储在ControlState 中。我更喜欢 MVC 框架而不是 WebForms 的原因之一。

    但是,在您的情况下,我相信您可以使用隐藏字段解决此问题。 asp:hidden。您只需要直接管理价值。所以当用户在下拉列表中选择一个项目时,更新相应的隐藏字段。

    【讨论】:

      【解决方案2】:

      我怀疑问题是因为您正在填充 DropDownList 控件客户端。当您回发时,服务器端会忽略您的 javascript 生成的项目,因为它会根据隐藏的 ControlState 重建控件。

      如果您希望在 WebForms 中使用 ajax,我会查看提供的 ajax 控件并使用更新面板。

      【讨论】:

      • 谢谢,是的,这是有道理的。
      最近更新 更多