1

だからここに行きます。「顧客」レコードに2つのドロップダウンリストがあります。最初のものは「ストア」と呼ばれます。2つ目は「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」ドロップダウンリストをロードするWebサービスを呼び出します。これはすべて素晴らしく機能しています。

私の問題は、レコードを保存するときです。顧客の新しいレコードを入力するとし、すべての値(およびStoreとStoreWarehouseのドロップダウンリスト)を入力します。「保存」をクリックします。これにより、データがデータベースに保存されます。私の問題は、StoreWarehouseドロップダウンリストのSelectedValueがビジネスレイヤーに到達しないことです。ListViewの「OnInserting」イベントのe.Valuesもキャプチャしましたが、e.Values["DefaultWarehouseId"]はnullです。2つのドロップダウンリストの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());

サーバー側のコードがこの値を取得しないのはなぜですか?

本当にありがとう!

マイク

4

2 に答える 2

2

@shiznit123が言ったように、この情報はControlStateに保存されます。私が WebForms よりも MVC フレームワークを好む理由の 1 つです。

ただし、あなたの状況では、隠しフィールドを使用してこの問題を回避できると思います。asp:hidden. 値を直接管理するだけです。したがって、ユーザーがドロップダウン リストの項目を選択すると、対応する非表示フィールドが更新されます。

于 2011-08-10T21:32:33.147 に答える
0

DropDownListコントロールのクライアント側にデータを入力しているために問題が発生しているのではないかと思います。ポストバックすると、サーバーサイドは非表示のControlStateに基づいてコントロールを再構築するため、JavaScriptで生成されたアイテムを無視します。

WebFormsでこの種のajaxが必要な場合は、提供されているajaxコントロールを調べて、更新パネルを使用します。

于 2011-08-10T20:03:57.320 に答える