2011-08-10 7 views
1

Alors voilà. J'ai deux listes déroulantes sur un enregistrement "client". Le premier s'appelle "Store". Le second s'appelle "StoreWarehouse". Lorsque l'utilisateur sélectionne une valeur "Store", cela filtre la liste déroulante "StoreWarehouse" en fonction de leur sélection. J'ai le filtrage effectué via jQuery et AJAX. J'utilise un ListView et c'est dans le InsertItemTemplate.La valeur SelectedValue de DropDownList est vide - pourquoi?

Voici le code pour que:

 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); 
      } 
     }); 
    } 

Ce JavaScript appelle un service web qui charge la liste déroulante « StoreWarehouse » en fonction de la sélection choisie dans la liste déroulante « Store ». Tout cela fonctionne à merveille.

Mon problème est lorsque je sauvegarde un enregistrement. Dites que je vais entrer dans un nouvel enregistrement pour un client, entrez toutes les valeurs (ainsi que les listes déroulantes Store et StoreWarehouse). Je vais cliquer sur "Enregistrer" - qui est alors censé enregistrer les données dans la base de données. Mon problème est le SelectedValue de la liste déroulante StoreWarehouse ne parvient pas à la couche de gestion. J'ai même capturé l'e.Values ​​pour l'événement "OnInserting" pour le ListView et e.Values ​​["DefaultWarehouseId"] est null. Voici ma page ASPX pour les deux listes déroulantes:

<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> 

Comme vous pouvez le voir, j'ai le « SelectedValue » dans la liste déroulante StoreWarehouse mis à <% # Bind (« DefaultwarehouseId »)%> . DefaultWarehouseId ne récupère pas la valeur dans la liste déroulante de StoreWarehouse.

Le plus drôle est que je peux mettre ce qui suit dans mon JavaScript qui est indiqué ci-dessus et il me avertit de la valeur sélectionnée de cette liste déroulante: code côté

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

Pourquoi pas le serveur cueillette cette valeur?

Merci beaucoup!

Mike

Répondre

0

Je soupçonne que le problème est parce que vous peuplez votre côté client de contrôle DropDownList. Lorsque vous publiez, le serveur ignore vos éléments générés par JavaScript, car il reconstruit les contrôles basés sur le ControlState caché.

Si vous voulez ajax pour ce genre de chose dans WebForms je regarderais dans les contrôles d'ajax fournis et utiliser juste un panneau de mise à jour.

+0

Merci, ouais c'est logique. – user888636

2

Comme @ shiznit123 a déclaré cette information est stockée dans le ControlState. Une des raisons pour lesquelles je préfère le framework MVC à WebForms.

Cependant, dans votre situation, je crois que vous pouvez contourner ce problème en utilisant des champs cachés. asp:hidden. Vous devez juste gérer la valeur directement. Ainsi, lorsque l'utilisateur sélectionne un élément dans la liste déroulante, mettez à jour le champ caché correspondant.

Questions connexes