Toutes les valeurs fournies lorsque l'utilisateur remplit le contenu de la page <FORM> ou saisit la valeur après l'URL dans la barre d'adresse du navigateur sont utilisées par le script ASP via les collections Form et QueryString. Il s'agit d'un moyen simple d'accéder aux valeurs du code ASP.
1. Techniques générales d'accès aux collections ASP
La plupart des collections ASP sont similaires aux collections ordinaires vues dans VB. En fait, il s'agit de tableaux de valeurs, mais on y accède à l'aide d'une clé de chaîne de texte (qui n'est pas sensible à la taille) et d'un index entier. Par conséquent, si la page Web du client contient le <FORM> comme suit :
<FORM ACTION="show_request.asp" METHOD="POST">
Prénom :<INPUT TYPE=”TEXT” NAME=”Prenom”>
Nom :<INPUT TYPE=”TEXT” NAME=”Nom”>
<INPUT TYPE=”SUBMIT” VALUE=”Envoyer”>
</FORM>
Vous pouvez accéder à la valeur dans son contrôle en accédant à la collection Form d'ASP :
strFirstName = Request.Form("FirstName")
strLastName = Request.Form("LastName")
peut également utiliser l'index entier des contrôles du formulaire. La plage de l'index commence à partir du premier contrôle défini dans le HTML, puis trie selon l'ordre de définition :
strFirstName =. Demande.Formulaire( 1)
strLastName = Request.Form(2)
Cependant, cette dernière technique d'utilisation de l'indexation entière n'est pas recommandée, car une fois le contrôle dans le code HTML modifié ou un nouveau contrôle inséré, le code ASP obtiendra une valeur erronée. De plus, c'est extrêmement déroutant pour les personnes qui lisent le code.
1) Pour accéder à toutes les valeurs de la collection,
vous pouvez transformer une série de valeurs sur l'ensemble du formulaire en une variable à un seul caractère en référençant la collection sans fournir de clé ni d'index.
StrAllFormContent = Request.Form
Si la zone de texte contient les valeurs Priscilla et Descartes, l'instruction Request.Form renverra les caractères suivants :
FirstName=Priscilla&LastName=Descartes
Notez que les valeurs fournies apparaissent sous forme de paires nom/valeur (c'est-à-dire Nom du contrôle = Valeur du contrôle), et chaque paire nom/valeur est séparée l'une de l'autre par le symbole "&". Cette technique est utile si vous envisagez de transmettre le contenu du formulaire à une application exécutable distincte ou à une DLL qui attend que les valeurs soient dans un format standard. Toutefois, de manière générale, le contenu d'une collection est accessible en utilisant le nom du contrôle sur le formulaire comme clé de texte.
2) Parcourir une collection ASP
Il existe deux manières de parcourir tous les membres d'une collection ASP. Les méthodes sont fondamentalement les mêmes que celles des collections VB ordinaires. Chaque collection fournit une propriété Count, qui renvoie le nombre d'éléments dans la collection. Il peut être parcouru à l'aide de la propriété Count à l'aide d'un index entier.
Pour intLoop = 1 à Request.Form.Count
Réponse.Write Request.Form(intLoop) & « <BR> »
SuivantSi
le formulaire précédent contient deux zones de texte avec les valeurs Priscilla et Descartes, vous obtiendrez les résultats suivants :
Priscilla
Descartes
Cependant, une meilleure approche consiste à utiliser la structure For Each...Next.
Pour chaque objItem dans Request.Form
Réponse.Write objItem & « = » & Request.Form(objItem) & « <BR> »
NextL'avantage
de ceci est que vous pouvez accéder à la fois au nom et à la valeur du contrôle. Le code ci-dessus donnera ce qui suit :
FirstName = Priscilla
LastName = Descartes
Notez que les valeurs <FORM> renvoyées par certains navigateurs à ASP peuvent ne pas être les mêmes que l'ordre affiché sur la page.
3) Nature à valeurs multiples des membres de la collection
Dans certains cas, chaque membre de la collection ASP peut avoir plus d'une valeur. Cela se produit lorsque plusieurs contrôles dans la définition HTML ont le même attribut Name. Par exemple :
<FORM ACTION=”Show_request.asp” METHOD=”POST”>
<INPUT TYPE=”TEXT” NAME=”AutreHobby”>
<INPUT TYPE=”TEXT” NAME=”AutreHobby”>
<INPUT TYPE=”TEXT” NAME=”AutreHobby”>
<INPUT TYPE=”SUBMIT” VALUE=”Envoyer”>
</FORM>
Dans la collection Form, une entrée sera créée pour "OtherHobby". Cependant, il inclura les valeurs des trois zones de texte. Si l'utilisateur laisse un ou plusieurs champs vides lors de la soumission, la valeur renvoyée est une chaîne vide. Si l'utilisateur saisit Jardinage et Alpinisme respectivement dans la première et la troisième zones de texte et que la deuxième zone de texte est vide, l'accès à Request.Form("OtherHobby") dans notre code ASP renverra la chaîne :
Jardinage, ,Alpinisme
Pour pouvoir accéder à une seule valeur dans ce cas, vous pouvez utiliser un code plus complexe :
Pour chaque objItem dans Request.Form
Si Request.Form(objItem).Count >1 Then 'Plusieurs valeurs dans cet élément Response.Write objItem & « :<BR> »
Pour intLoop = 1 Pour Request.Form(objItem).Count
Response.Write "Subkey" & intLoop & "value = "& Request.Form(objItem) (intLoop) & "<BR>"
Suivant
Autre
Response.Write objItem & « = » & Request.Form(objItem) & « <BR> »
Fin si
NextPour
l'instance de formulaire précédente contenant trois contrôles OtherHobby, cela renverrait :
OtherHobby :
Valeur de la sous-clé 1 = Jardinage
Valeur de la sous-clé 2 =
Valeur de la sous-clé 3 = Alpinisme
Cependant, comme il est rare de donner le même nom à plusieurs zones de texte, cette technique est rarement utilisée.
a) Contrôles de bouton radio ou de page en HTML
En HTML, la situation où plusieurs contrôles doivent recevoir le même attribut Name est le bouton radio (ou option), par exemple :
<FORM ACTION="show_request.asp" METHOD=" POST »>
J'habite à :
<INPUT TYPE=”RADIO” NAME=”Pays” VALUE=”AM”>Amérique<BR>
<INPUT TYPE=”RADIO” NAME=”Pays” VALUE=”EU”>Europe<BR>
<INPUT TYPE=”RADIO” NAME=”Pays” VALUE=”AS”>Asie<BR>
<INPUT TYPE=”SUBMIT” VALUE=”Envoyer”>
</FORM>
Étant donné que l'utilisateur ne peut sélectionner qu'un seul des multiples éléments (c'est pourquoi ils reçoivent le même nom), une seule valeur de retour sera obtenue et le navigateur ne peut envoyer que la valeur du contrôle sélectionné. Par conséquent, si l'utilisateur de ce formulaire a sélectionné "Europez", cette entrée sera obtenue, et sa valeur sera obtenue en parcourant l'ensemble du formulaire :
Pays = UE
Puisqu'un attribut VALEUR différent est fourni pour chaque contrôle, il reflète la valeur correspondant à chaque entrée. Le nom du pays ou de la région. Si l'attribut VALUE est omis, le navigateur renverra la valeur "on", vous obtiendrez donc :
Pays = on
Ceci n'est pas souvent utilisé, donc l'attribut VALUE est généralement utilisé pour les commandes radio du même nom.
b) Contrôle de case à cocher HTML
Lorsque le code source HTML d'un formulaire contient un contrôle de case à cocher, celui-ci reçoit généralement un nom unique, par exemple :
<FORM ACTION="show_request.asp" METHOD="POST">
J'apprécie :
<INPUT TYPE=”CHECKBOX” NAME=”Lecture” CHECKED> Lecture
<INPUT TYPE=”CHECKBOX” NAME=”Manger”>Manger
<INPUT TYPE=”CHECKBOX” NAME=”Dormir”> Dormir
<INPUT TYPE=”SUBMIT” VALUE=”Envoyer”>
</FORM>
Dans ce cas, lors de la soumission du formulaire, si seules les première et troisième cases sont cochées (marquées), lors du parcours de la collection Form, les valeurs suivantes seront obtenues :
Lecture = on
Sleeping = on
Cependant, si vous fournissez une valeur pour chaque case à cocher, cette valeur est envoyée au serveur à la place de la chaîne "on". Par exemple, le formulaire est le suivant :
<FORM ACTION="show_request.asp" METHOD="POST">
J'apprécie :
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby025” NAME=”Hobby” CHECKED>_
Natation
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby003” NAME=”Hobby” CHECKED>_
En lisant
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby068” NAME=”Hobby”>Manger
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby010” NAME=”Hobby”>Dormir
<INPUT TYPE=”SUBMIT” VALUE=”Envoyer”>
</FORM>
Si toutes les cases sauf la troisième sont cochées, la collection Request.Form produira les résultats suivants :
Hobby = Hobby025, Hobby003, Hobby010
Si vous écrivez un code de parcours de collection plus complexe, comme mentionné précédemment (affiché séparément pour chaque sous-clé) , vous obtenez le résultat :
Hobby :
Valeur de la sous-clé 1 = Hobby025
Valeur de la sous-clé 2 = Hobby003
Valeur de la sous-clé 3 = Hobby010
Il est à noter que dans deux cas, le contrôle non sélectionné ne renvoie aucune valeur. Dans le résultat du premier cas, il n'y a pas de virgules trompeuses et il n'y a pas de valeurs nulles dans le second cas. Ceci est différent des résultats du test équivalent utilisant des zones de texte décrit ci-dessus. Lors de l'utilisation de zones de texte, chaque zone de texte renvoie une valeur, même une chaîne vide. Cela est dû au navigateur. Par conséquent, vous devez prêter attention à ce problème lorsque vous accédez aux collections en code ASP.
Un effet secondaire délicat de la situation ci-dessus est que lors de l'utilisation de cases à cocher, l'index de la valeur de la case à cocher n'a aucune relation avec la position du contrôle dans le code HTML d'origine. Dans l'exemple ci-dessus, la quatrième case à cocher a un numéro de sous-clé de 3. car lorsque le formulaire est soumis, le deuxième contrôle n'est pas sélectionné.
c) Contrôle de liste HTML
La balise <SELECT> en HTML est utilisée pour générer une zone de liste déroulante standard, dont les valeurs sont représentées de manière hybride intéressante. Le formulaire suivant est créé avec 5 valeurs parmi lesquelles l'utilisateur peut sélectionner. Puisqu'il contient l'attribut MULTIPLE, il est possible de sélectionner plusieurs entrées en maintenant la touche Maj ou Ctrl enfoncée lors de la sélection.
<FORM ACTION=”show_request.asp” METHOD=”POST”>
<SELECT NAME=”Hobby” SIZE=”5” MULTIPLE>
<OPTION VALUE=”Hobby001”>Programmation</OPTION>
<OPTION VALUE=”Hobby025”>Natation</OPTION>
<OPTION VALUE=”Hobby003”>Lecture</OPTION>
<OPTION VALUE=”Hobby068”>Manger</OPTION>
<OPTION VALUE=”Hobby010”>Dormir</OPTION>
</SELECT><P>
<INPUT TYPE=”SUBMIT” VALUE=”Envoyer”>
</FORM>
renvoie une seule entrée dans la collection Form, qui contient les valeurs sélectionnées (l'attribut VALUE spécifié dans une seule balise <OPTION>), séparées par des virgules :
Hobby = Hobby025, Hobby003, Hobby010
si En utilisant un code de parcours d'ensemble légèrement plus complexe (affichant chaque sous-clé individuellement), nous obtenons :
Hobby :
Valeur de la sous-clé 1 = Hobby025
Valeur de la sous-clé 2 = Hobby003
Valeur de la sous-clé 3 = Hobby010
C'est la même situation que ci-dessus pour la case à cocher du même nom. En fait, une liste SELECT peut être considérée comme une liste de cases à cocher permettant de sélectionner (et non de cocher) les éléments correspondants.
Cependant, la zone de liste a également une valeur spécifiée. Si vous définissez l'attribut VALUE dans la balise <OPTION>, vous obtiendrez le contenu textuel de l'option sélectionnée. L'ensemble Request.Form contiendra un élément tel :
Hobby = Swimming, La lecture, la mise en veille
et, de même, un code d'itération de collection plus complexe renverraient des résultats comme celui-ci :
Hobby :
Valeur de la sous-clé 1 = Natation
Valeur de la sous-clé 2 = Lecture
Valeur de la sous-clé 3 = Dormir
Bien sûr, si un seul élément est sélectionné et que l'attribut VALEUR est fourni dans <OPTION>, le résultat contiendra uniquement :
Hobby = Hobby025.
Si l'attribut VALEUR n'est pas fourni, le résultat sera :
Hobby =. Natation
Cela lui permet d'être manquant. Provincial (c'est-à-dire aucune VALEUR) affiche le texte de l'option et peut également apporter les modifications correspondantes. Ce dernier cas est extrêmement utile dans certaines situations, comme lorsque vous souhaitez afficher (une chaîne descriptive) et transmettre un contenu complètement différent (comme utiliser un code court pour représenter une chaîne descriptive).
d) Les cases à cocher et les boutons radio de soumission HTML et d'image
sont des exemples de contrôles booléens qui renvoient « on » lorsqu'ils sont cochés ou sélectionnés. Contrairement aux zones de texte et à la plupart des autres contrôles HTML, les navigateurs n'incluent pas de contrôles non cochés ou sélectionnés. non sélectionné.
Il existe un autre contrôle booléen couramment utilisé appelé bouton HTML. Tels que les types <INPUT TYPE="SUBMIT">, <INPUT TYPE="RESET">, <INPUT TYPE="IMAGE">, <INPUT TYPE="BUTTON"> et <BUTTON>...</BUTTON>.
Les contrôles de type BUTTON ne renvoient aucune valeur car ils n'ont pas d'impact direct sur le formulaire. Même si vous utilisez la méthode Submit utilisée pour appeler le formulaire, le navigateur n'inclura la valeur du contrôle de type BUTTON dans aucune requête. De même, la valeur d'un bouton <INPUT TYPE="RESET"> n'est jamais envoyée au serveur.
Cependant, les contrôles de bouton de saisie de type SUBMIT et IMAGE soumettent en fait le formulaire au serveur, et leurs propriétés VALUE contiennent les valeurs des autres contrôles du formulaire (à condition qu'un attribut NAME soit inclus dans la définition HTML). Par exemple, ce formulaire peut faire partie d'une application Web de type assistant qui permet à l'utilisateur de parcourir ou d'annuler un processus :
<FORM ACTION="show_request.asp" METHOD="POST">
<INPUT TYPE=”SUBMIT” NAME=”btnSubmit” VALUE=”Suivant”>
<INPUT TYPE=”SUBMIT” NAME=”btnSubmit” VALUE=”Précédent”>
<INPUT TYPE=”SUBIMT” NAME=”btnSubmit” VALUE=”Annuler”>
</FORM>
Dans un formulaire, vous pouvez inclure plusieurs boutons SOUMETTRE. Dans ce cas, chaque bouton doit recevoir un attribut VALUE unique, comme indiqué ci-dessus. Lorsqu'un formulaire est soumis, le parcours des valeurs de la collection Request.Form produira une valeur qui dépend du bouton sur lequel vous avez appuyé pour soumettre le formulaire. Si l'utilisateur appuie sur le bouton "Précédent", il obtiendra :
btnSubmit = Précédent
Par conséquent, la collection Request.Form peut être interrogée pour déterminer la page suivante affichée, par exemple :
Select Case Request.Form("btnSubmit")
Cas "Suivant"
Réponse.Redirection "page_3.asp"
Cas "Précédent"
Réponse.Redirection "page_1.asp"
Cas "Annuler"
Réponse.Redirection "main_menu.asp"
Fin de la sélection
Dans le même temps, vous pouvez également utiliser différents attributs NAME pour chaque bouton selon vos besoins. Et sélectionnez le nom du contrôle dont la valeur est contenue dans la collection Form. Extrêmement utile dans les situations où le contrôle n'a pas de balisage complet mais est plutôt suivi d'une étiquette de texte plus longue, comme le montre l'image ci-dessous.
L'interface sur cet écran est générée par le code suivant :
<FORM ACTION="show_request.asp" METHOD="POST">
<B>Que veux-tu faire maintenant ?</B><P>
<INPUT TYPE=”SUBMIT” NAME=”btnNext” VALUE= ”>Aller à la page suivante<P>
<INPUT TYPE=”SUBMIT” NAME=”btnPrevious” Value=” ”> REVENIR à la page précédente<P>
<INPUT TYPE=”SUBMIT” NAME=”btnCancel” VALUE=” ”>Annuler et revenir à la page du menu principal<P>
</FORM>
Dans la page ASP, après avoir reçu les données, vous pouvez vérifier la valeur fournie par le nom du bouton pour déterminer quel bouton a été enfoncé.
Si Len(Request.Form("btnNext")) Then Response.Redirect "page_3.asp"
Si Len(Request.Form("btnPrevious")) Then Response.Redirect "page_1.asp"
If Len(Request.Form("btnCancel")) Then Response.Redirect "main_menu.asp"
Ce travail consiste à interroger la collection ASP sur une clé et à renvoyer une chaîne vide si elle n'existe pas. Autrement dit, si l'on appuie sur le deuxième bouton (page précédente), la valeur de Request.Form("btnNext") est une chaîne vide, et sa longueur est nulle sans générer d'erreur. Lorsque vous appuyez sur le deuxième bouton, la valeur de cette entrée dans la collection Form, Request.Form("btnPrevious"), sera " " et sa longueur est supérieure à zéro.
e) Améliorer l'efficacité de l'utilisation de la collection Request
L'accès à une collection ASP pour télécharger une valeur est un processus long et gourmand en calcul car l'opération implique une série de recherches dans des collections associées, ce qui est beaucoup plus lent que l'accès à une variable locale. Par conséquent, si vous envisagez d'utiliser une valeur de la collection plusieurs fois sur la page, vous devez envisager de la stocker en tant que variable locale, par exemple :
strTitle = Request.Form("Title")
strPremierNom = Requête.Form("Prénom")
strLastName = Request.Form("LastName")
Si Len(stTitle) Alors strTitle = strTitle & " "
Si strFirstName = " " Alors
StrFullName = strTitle & " " & strLastName
SinonSi Len(strFirstName) = 1 Alors
StrFullName = strTitle & strFirstName & « · » & strLastName
Autre
StrFullName = strTitle & strFirstName & " " & strLastName
Fin Si
f) Rechercher dans toutes les collections Request
Dans certains cas, il est possible de savoir que le nom de clé d'une valeur apparaîtra dans la collection Request, mais pas exactement de quelle collection il s'agit. Par exemple, si plusieurs pages (ou différentes sections d'une page) envoient une valeur au même script ASP, celle-ci peut apparaître dans la collection Form ou QueryString.
Pour voir pourquoi une valeur peut apparaître dans différentes collections, considérez cette situation : une page est demandée à l'aide de l'élément de lien hypertexte <A>. Dans ce cas, la seule façon d’ajouter une valeur à la requête est de l’ajouter à l’URL. Cependant, la même valeur peut déjà apparaître dans un <FORM> sur une autre page, ou dans une autre partie de la même page :
...
<FORM ACTION=”process_page.asp” METHOD=”POST”>
<INPUT TYPE=”SUBMIT” NAME=”page” VALUE=”Suivant”>
<INPUT TYPE=”SUBMIT” NAME=”page” VALUE=”Précédent”>
<INPUT TYPE=”SUBMIT” NAME=”page” VALUE=”Aide”>
</FORMULAIRE>
...
...
Pour obtenir de l'aide, accédez à la <A HREF=”process_page.asp?page=Help”>Page d'aide</A>
...
Dans ce cas, appuyer sur le bouton Aide du formulaire enverra la paire nom/valeur « page=Aide » de la collection Request.Form. Cependant, appuyer sur le lien hypertexte <A> peut également envoyer le nom/valeur « Page=Help », mais cette fois dans la collection QueryString. Pour accéder à cette valeur, utilisez une fonctionnalité spéciale de l'objet ASP Request :
strPage = Request("page")
Cela recherchera toute la collection - QueryString, Form, Cookies, ClientCertificate, ServerVariables - dans l'ordre, jusqu'à ce que le nom de la première valeur correspondante soit trouvé. Cela est moins efficace que d'accéder directement à la collection appropriée et n'est pas sûr à moins qu'il n'y ait une garantie absolue que la valeur n'apparaîtra pas dans une autre collection.
Par exemple, vous souhaiterez peut-être collecter le nom du serveur Web qui répond à la demande d'un client en recherchant « SERVER_NAME » dans la collection Request.ServerVariables qui apparaît dans chaque requête. Cependant, si une autre collection contient également une valeur nommée "server_name" (rappelez-vous que les noms de clés ne sont pas sensibles à la casse), vous obtiendrez des résultats incorrects lors de l'utilisation de Request("server_name"). En utilisant la syntaxe Reqeust.ServerVariables("server_name"), nous aurons du mal à suivre les erreurs.
En résumé, utilisez la technique « rechercher dans toute la collection » avec une extrême prudence et uniquement lorsqu'aucune autre technique ne fournira les résultats dont vous avez besoin.
g) Accéder à d'autres collections
Dans cette section de cet article, nous nous sommes concentrés sur la collection Form, qui est probablement la plus utilisée. Cependant, toutes ces techniques sont également applicables à d’autres objets. Y compris ceux fournis par les collections de l'objet Request (c'est-à-dire Form, QueryString, Cookies, ServerVariables et ClientCertificate), et les cookies (et collections fournies par d'autres objets) fournis par l'objet Response.
Nous examinerons brièvement la manière dont une valeur est saisie dans une collection QueryString, ainsi que ses avantages et ses inconvénients. Cependant, les deux ensembles de cookies disposent de fonctionnalités supplémentaires qui rendent l'utilisation des cookies plus pratique, comme indiqué ci-dessous.