SelectedValue DropDownList пуст, почему?

Итак, поехали. У меня есть два раскрывающихся списка в записи «клиент». Первый называется «Магазин». Второй называется «МагазинСклад». Когда пользователь выбирает значение «Магазин», это фильтрует раскрывающийся список «МагазинСклад» на основе их выбора. У меня есть фильтрация через 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 вызывает веб-службу, которая загружает раскрывающийся список «StoreWarehouse» на основе выбора, выбранного в раскрывающемся списке «Store». Все это прекрасно работает.

Моя проблема заключается в том, что я сохраняю запись. Скажем, я буду вводить новую запись для клиента, введите все значения (а также раскрывающиеся списки Store и StoreWarehouse). Я нажму «Сохранить», что затем должно сохранить данные в базе данных. Моя проблема заключается в том, что SelectedValue из раскрывающегося списка StoreWarehouse не доходит до бизнес-уровня. Я даже перехватил e.Values ​​для события OnInserting для ListView, а e.Values["DefaultWarehouseId"] имеет значение null. Вот моя страница 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>

Как видите, у меня есть «SelectedValue» в раскрывающемся списке StoreWarehouse, установленное на ‹%# Bind("DefaultwarehouseId")%>. DefaultWarehouseId по какой-то причине не получает значение в раскрывающемся списке для StoreWarehouse.

Забавно то, что я могу поместить следующее в свой JavaScript, показанный выше, и он предупредит меня о выбранном значении этого раскрывающегося списка:

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

Почему код на стороне сервера не получает это значение?

Огромное спасибо!

Майк


person user888636    schedule 10.08.2011    source источник


Ответы (2)


Как сказал @shiznit123, эта информация хранится в ControlState. Одна из причин, по которой я предпочитаю фреймворк MVC WebForms.

Однако в вашей ситуации я считаю, что вы можете обойти эту проблему, используя скрытые поля. asp:hidden. Вам просто нужно управлять значением напрямую. Поэтому, когда пользователь выбирает элемент в раскрывающемся списке, обновите соответствующее скрытое поле.

person Josiah Ruddell    schedule 10.08.2011

Я подозреваю, что проблема в том, что вы заполняете клиентскую часть управления DropDownList. Когда вы выполняете обратную передачу, серверная часть игнорирует элементы, сгенерированные javascript, потому что она перестраивает элементы управления на основе скрытого ControlState.

Если вам нужен ajax для такого рода вещей в WebForms, я бы посмотрел на предоставленные элементы управления ajax и просто использовал панель обновления.

person agradl    schedule 10.08.2011
comment
Спасибо, да, это имеет смысл. - person user888636; 11.08.2011