Выбранное значение DropDownList пустое - почему? - PullRequest
1 голос
/ 10 августа 2011

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

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

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

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

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

Спасибо большое!

Mike

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

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

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

0 голосов
/ 11 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...