2009-10-27 5 views

Répondre

1

Bien avant que le concept d'AJAX ne soit formalisé, j'utilisais une technique appelée XML Data Islands pour obtenir ce type de fonctionnalité. De toute évidence, il existe un certain nombre de frameworks AJAX et de scripts qui peuvent aboutir à des résultats similaires, mais ce n'est que la technique éprouvée que j'ai utilisée pendant des années dans mes anciennes applications.

Je n'arrive pas à trouver rapidement les articles appropriés, j'ai donc déterré un peu de mon ancien code. Fondamentalement, lorsque vous définissez la valeur du contrôle parent, vous exécutez du javascript qui envoie une requête à une page ASP distincte. Cette page interroge la base de données pour déterminer les données qui seront utilisées pour remplir le contrôle enfant.

Cette deuxième page renvoie les résultats sous forme de fichier XML, qui est stocké et manipulé dans une zone de données XML dans votre page principale. Le javascript appelant analyse ensuite le code XML renvoyé et remplit le contrôle enfant.

Tout d'abord, nous avons les appels javascript de la commande primaire:

<tr> 
        <td>Customer:</td> 
        <td> 
         <select id="CustomerID" NAME="CustomerID" 
          onfocus="javascript:populateCombo(fProcess.CustomerID.value)" 
          onChange="javascript:populateCombo(fProcess.CustomerID.value)" 
          onkeypress="javascript:populateCombo(fProcess.CustomerID.value);"> 
         </select> 
        </td> 
       </tr> 
       <tr> 
        <td>Depot:</td> 
        <td> 
         <select name="depot" id="depot" size="1" alt="Depot"> 
          <option value="" selected >&lt;Select Depot&gt;</option> 
         </select> 
        </td> 
       </tr> 

Ensuite, nous avons le javascript qui fait appel à la deuxième page (qui récupère les données de la DB):

// Fill combo with XML data 
function populateCombo(par) { 
    var currNode; 

    XMLID.async = false; 

    // Change Data Island source 
    strQuery = "Select LocationID, LocationName from Locations where CustomerID='" + par + "' and Active = 1 Order By LocationName"; 
    XMLID.SRC="/fxdb/common/xmlQuery.asp?strQuery=" + strQuery; 

    // Get all "names" from XML data 
    objNodeList = XMLID.getElementsByTagName("LocationName"); 
    objNodeListID= XMLID.getElementsByTagName("LocationID"); 


    // Fill combo with names 
    for (var i=0; i < objNodeList.length; i++) { 
     fProcess.depot.options[i]=new Option(objNodeList.item(i).text,objNodeListID.item(i).text); 
    } 

    // Delete extra entries 
    while (objNodeList.length < fProcess.depot.options.length) { 
     fProcess.depot.options[(fProcess.depot.options.length - 1)] = null; 
    } 

} 

Et enfin, la page qui interroge la base de données elle-même.

<%@ Language="VBScript" %> 
<% 
' Declare all variables. 
Option Explicit 
Dim strSql,objRS,objField 
Dim sConn, oConn 
Dim strName, strValue 


' Buffer and output as XML. 
Response.Buffer = True 
Response.ContentType = "text/xml" 

' Start our XML document. 
Response.Write "<?xml version=""1.0""?>" & vbCrLf 

' Set SQL and database connection string. 

set oConn=server.createobject("adodb.connection") 
sConn=Application("Connection") 
oConn.Open sConn 
strSQL = Request.QueryString("strQuery") 

set objRS=oConn.execute(strSQL) 

' Output start of data. 
Response.Write "<database>" & vbCrLf 

' Loop through the data records. 
While Not objRS.EOF 
    ' Output start of record. 
    Response.Write "<record>" & vbCrLf 
    ' Loop through the fields in each record. 
    For Each objField in objRS.Fields 
     strName = objField.Name 
     strValue = objField.Value 
     If Len(strName) > 0 Then strName = Server.HTMLEncode(strName) 
     If Len(strValue) > 0 Then strValue = Server.HTMLEncode(strValue) 
     Response.Write "<" & strName & ">" & vbCrLf 
     Response.Write strValue & vbCrLf 
     Response.Write "</" & strName & ">" & vbCrLf 
    Next 
    ' Move to next city in database. 
    Response.Write "</record>" & vbCrLf 
    objRS.MoveNext 
Wend 

' Output end of data. 
Response.Write "</database>" & vbCrLf 
%> 

Editer: Oups! J'ai oublié le très important XML Data Island - ajoutez ceci après votre balise Body.

<!-- Data Island--> 
<XML ID="XMLID"></XML> 
+0

Remarque Les îlots XML sont un concept IE uniquement, mais le principe général peut être appliqué en utilisant XmlHTTPRequest. – AnthonyWJones

+0

Bonjour CJM, merci beaucoup ... c'est exactement ce que je cherchais ... mais ça me donne cette erreur javascript: "XMLID n'est pas défini" ... que puis-je faire? – Davide

+0

AH désolé - voir ci-dessus. – CJM

0

Je devine que le mot que vous avez manqué de "Asp Combobox ajax" est "en cascade". Le concept où l'ensemble des éléments disponibles dans une combox dépend d'une valeur sélectionnée dans une précédente combox ou dans un autre champ.

Il ne semble y avoir aucun bon exemple simple dans ASP seul. Cependant, en combinaison avec jquery, vous pouvez essayer ce lien, jquery.cascade cascading values from forms.

Cela vous laisse seulement besoin de créer les pages ASP qui génèrent le simple JSON requis.

+0

Oui Anthony, je cherche "Cascading combobox"! Le concept est le suivant, mais je souhaite trouver un exemple de code dans asp classique, pas dans asp.net – Davide

+0

@Davide: Oups n'a pas remarqué que le contenu de la page était ASP.NET pas ASP. Il ne semble pas y avoir d'exemples simples dans Classic. – AnthonyWJones