2011-08-10 44 views
1

所以我們走吧。我在「客戶」記錄上有兩個下拉列表。第一個叫做「Store」。第二個叫做「StoreWarehouse」。當用戶選擇一個「Store」值時,會根據用戶的選擇過濾「StoreWarehouse」下拉列表。我通過jQuery和AJAX完成了過濾。我正在使用一個ListView,這是在InsertItemTemplate中。DropDownList的SelectedValue爲空 - 爲什麼?

下面的代碼爲:

 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 and StoreWarehouse下拉列表)。我將點擊「保存」 - 然後應該將數據保存到數據庫。我的問題是StoreWarehouse下拉列表中的SelectedValue沒有進入業務層。我甚至爲ListView的「OnInserting」事件捕獲了e.Values,而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> 

正如你所看到的,我有設定爲<%#綁定(「DefaultwarehouseId」)%>的StoreWarehouse下拉列表中的「的SelectedValue」 。由於某種原因,DefaultWarehouseId沒有選擇StoreWarehouse的下拉列表中的值。

有趣的是,我可以把下列我的JavaScript如上圖所示,它提醒我,下拉列表中選定的值:

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

爲什麼沒有在服務器端代碼採摘增加這個值?

非常感謝!

邁克

回答

0

我會懷疑這個問題是因爲你填充你的DropDownList控制客戶端。當你回發服務器端時忽略你的JavaScript生成的項目,因爲它重建基於隱藏的ControlState的控件。

如果你想在WebForms中使用這種類型的ajax,我會查看提供的ajax控件,並使用更新面板。

+0

謝謝,是的,這是有道理的。 – user888636

2

贊@ shiznit123表示這些信息存儲在ControlState中。我更喜歡MVC框架而不是WebForms的原因之一。

但是,在您的情況下,我相信您可以使用隱藏字段來解決此問題。 asp:hidden。您只需直接管理該值。所以當用戶選擇下拉列表中的一個項目時,更新相應的隱藏字段。

相關問題