2010-12-08 39 views
0

Ouais, c'est un titre long et alambiqué ... désolé. Je travaille dans VBScript dans ASP bon ol '. J'ai un objet de dictionnaire, et chaque objet dans le dictionnaire se compose de sa clé et d'un tableau comme élément.erreur lors de l'obtention VBScript (Classic ASP) Valeurs de l'objet du dictionnaire dynamiquement sur la deuxième itération d'un For ... Chaque boucle

Dim myDictionary 
Set myDictionary = CreateObject("Scripting.Dictionary") 

myDictionary.Add "a", Array("a1","a2") 
myDictionary.Add "b", Array("b1","b2") 
myDictionary.Add "c", Array("c1","c2") 

Je passe aussi dans le script une liste de chaînes (et la conversion à un tableau), qui correspondent aux différentes entrées du dictionnaire, de sorte que seules les entrées peuvent être affichées sur la page, et dans l'ordre de le tableau. Maintenant, je veux parcourir le tableau et montrer le contenu de chaque clé correspondante dans myDictionary.

For Each thing in myArray 
    Response.Write myDictionary.Item(thing)(0) & "&nbsp;" & myDictionary.Item(thing)(1) & "<br />" & vbcrlf 
Next 

Fonctionne parfaitement dans la première itération et imprime correctement sur la page. Mais à la deuxième itération, j'ai une erreur. Voici la sortie complète de la page:

a1 a2

Erreur d'exécution Microsoft VBScript

'800a000d' incompatibilité Type: 'article (...)'

/Alpine/en_us /testCase.asp, ligne 28

Quelqu'un sait pourquoi cela ne fonctionne pas? Naturellement, le code montré ici est juste un cas de test, mais j'ai exactement le même problème dans mon application.

Voici le code complet, de sorte que vous pouvez simplement coller couper-n-dans votre environnement de test, si elle vous aide à me aider à comprendre cela:

<%@LANGUAGE="VBSCRIPT"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Iterating through Dictionary objects - Test Case</title> 
</head> 

<body> 

<% 


Dim myDictionary 
Set myDictionary = CreateObject("Scripting.Dictionary") 

myDictionary.Add "a", Array("a1","a2") 
myDictionary.Add "b", Array("b1","b2") 
myDictionary.Add "c", Array("c1","c2") 

Dim myText 
myText = "a, b, c" 

Dim myArray 
myArray = Split(myText,",") 

For Each thing in myArray 
    Response.Write myDictionary.Item(thing)(0) & "&nbsp;" & myDictionary.Item(thing)(1) & "<br />" & vbcrlf 
Next 

%> 


</body> 
</html> 

D'autres éléments intéressants sur ce problème ...

Quand je coder en dur les trois entrées du dictionnaire dans les itérations, il fonctionne très bien:

For Each thing in myArray 
    Response.Write myDictionary.Item("a")(0) & "&nbsp;" & myDictionary.Item("a")(1) & "<br />" & vbcrlf 
    Response.Write myDictionary.Item("b")(0) & "&nbsp;" & myDictionary.Item("b")(1) & "<br />" & vbcrlf 
    Response.Write myDictionary.Item("c")(0) & "&nbsp;" & myDictionary.Item("c")(1) & "<br />" & vbcrlf 
Next 

Produit ceci:

a1 a2
b1 b2
c1 c2
a1 a2
b1 b2
c1 c2
a1 a2
b1 b2
c1 c2

Et pour vérifier que la 'chose' variable dans la boucle for-each fonctionne:

For Each thing in myArray 
    Response.Write thing 
Next 

Produit ceci:

abc

Je suis confus ...

Merci à tous! J'apprécie vraiment toute aide que vous pouvez fournir. :-)

Cheers,
Lelando

Répondre

3

Il est parce que vous avez des espaces après vos virgules myText. La fonction Split crée un tableau avec les valeurs "a", " b", " c". Les deux secondes valeurs n'existent pas dans votre dictionnaire.

Remplacer la ligne

myText = "a, b, c" 

Avec

myText = "a,b,c" 

Ou changer votre delimiter jeton avec ", " (notez l'espace).

+0

Eh bien, ça l'a fait! Puisque tous mes termes clés possibles sont des mots simples, et je sais que les personnes qui créeront la liste délimitée par des virgules utiliseront des espaces * de manière incohérente *, je devrai d'abord supprimer tous les espaces de la liste, je pense. Cela vous semble-t-il correct? – Lelando

+0

Oh, et ** merci **! – Lelando

+0

Ça me semble bien. Utilisez simplement myText = Replace (myText, "", "") – Tmdean