ユーザーがページの <FORM> コンテンツを入力するとき、またはブラウザのアドレス バーの URL の後に値を入力するときに提供されるすべての値は、Form および QueryString コレクションを通じて ASP スクリプトによって使用されます。これは、ASP コード内の値にアクセスする簡単な方法です。
1. ASP コレクションにアクセスするための一般的なテクニック。
ほとんどの ASP コレクションは、VB で見られる通常のコレクションと似ています。事実上、これらは値の配列ですが、テキスト文字列キー (サイズに依存しない) と整数インデックスを使用してアクセスされます。したがって、クライアント Web ページに次のような <FORM> が含まれているとします。
<FORM ACTION="show_request.asp" METHOD="POST">
名:<INPUT TYPE=”TEXT” NAME=”名”>
姓:<INPUT TYPE=”TEXT” NAME=”姓”>
<入力タイプ=”送信” 値=”送信”>
</FORM>
ASP の Form コレクションにアクセスすることで、コントロール内の値にアクセスできます:
strFirstName = Request.Form("FirstName")
strLastName = Request.Form("LastName") は、
フォーム内のコントロールの整数インデックスを使用することもできます。インデックスの範囲は、HTML で定義された最初のコントロールから始まり、定義の順序に従って並べ替えられます
。リクエストフォーム( 1)
strLastName = Request.Form(2)
ただし、後者の整数インデックスを使用する手法は、HTML 内のコントロールが変更されるか、新しいコントロールが挿入されると、ASP コードが間違った値を取得するため、お勧めできません。さらに、コードを読む人にとっては非常に混乱を招きます。
1) コレクションのすべての値にアクセスするには、
キーやインデックスを指定せずにコレクションを参照することで、フォーム全体の一連の値を単一の文字変数に変換できます。
StrAllFormContent = Request.Form
テキスト ボックスに値 Priscilla と Descartes が含まれている場合、Request.Form ステートメントは次の文字を返します:
FirstName=Priscilla&LastName=Descartes
指定された値は名前と値のペアの形式で表示されることに注意してください。 (つまり、コントロール名 = コントロール値)、各名前と値のペアは記号「&」で区切られます。この手法は、値が標準形式であることが期待される別の実行可能アプリケーションまたは DLL にフォームの内容を渡す予定がある場合に便利です。ただし、一般的に、コレクションのコンテンツには、フォーム上のコントロールの名前をテキスト キーとして使用してアクセスします。
2) ASP コレクションの走査
ASP コレクション内のすべてのメンバーを走査するには 2 つの方法があります。方法は基本的に通常の VB コレクションと同じです。各コレクションには、コレクション内の項目の数を返す Count プロパティが用意されています。整数インデックスを使用する Count プロパティを使用して走査できます。
intLoop=1 の場合 Request.Form.Count へ
Response.Write Request.Form(intLoop) & “<BR>”
次へ前のフォームに Priscilla と Descartes の値を含む 2 つのテキスト ボックスが含まれている
場合
、次の結果が得られます:Priscilla
デカルト
ただし、より良いアプローチは、For Each...Next 構造を使用することです。
Request.Form の各 objItem について
Response.Write objItem & “= & Request.Form(objItem) & “<BR>”
次へ
これの利点は、コントロールの名前と値の両方にアクセスできることです。上記のコードの結果は次のようになります:
FirstName = Priscilla
LastName = Descartes
一部のブラウザから ASP に返される <FORM> 値は、ページに表示される順序と異なる場合があることに注意してください。
3) コレクション メンバーの複数値の性質
場合によっては、ASP コレクション内の各メンバーが複数の値を持つことがあります。これは、HTML 定義内に同じ Name 属性を持つコントロールが複数ある場合に発生します。例:
<FORM ACTION=”Show_request.asp” METHOD=”POST”>
<INPUT TYPE=”TEXT” NAME=”その他趣味”>
<INPUT TYPE=”TEXT” NAME=”その他趣味”>
<INPUT TYPE=”TEXT” NAME=”その他趣味”>
<入力タイプ=”送信” 値=”送信”>
</FORM>
Formコレクションに「OtherHobby」のエントリが作成されます。ただし、3 つのテキスト ボックスの値が含まれます。ユーザーが送信時に 1 つ以上のフィールドを空白のままにした場合、返される値は空の文字列です。ユーザーが最初と 3 番目のテキスト ボックスにそれぞれ「Gardening」と「Mountaineering」と入力し、2 番目のテキスト ボックスが空の場合、ASP コードで Request.Form("OtherHobby") にアクセスすると、次の文字列が返されます:
Gardening
, ,Mountaineering
この場合、単一の値にアクセスするには、より複雑なコードを使用できます。
For Each objItem In Request.Form
If Request.Form(objItem).Count >1 then 'この項目に複数の値が含まれます Response.Write objItem & “:<BR>”
intLoop = 1 の場合、Request.Form(objItem).Count へ
Response.Write “Subkey” & intLoop & “value = “&Request.Form(objItem) (intLoop) & “<BR>”
次
それ以外
Response.Write objItem & “ = ” & Request.Form(objItem) & “<BR>”
終了の場合
次 3 つの OtherHobby コントロールを含む前のフォーム インスタンス
の場合
、次が返されます:OtherHobby:
サブキー 1 の値 = ガーデニング
サブキー 2 の値 =
サブキー 3 の値 = Mountaineering
ただし、複数のテキスト ボックスに同じ名前を付けることはまれであるため、このテクニックはほとんど使用されません。
a) HTML のラジオまたはページ ボタン コントロール
HTML では、複数のコントロールに同じ Name 属性を与える必要がある状況は、ラジオ (またはオプション) ボタンです。例:
<FORM ACTION="show_request.asp" METHOD=" POST >
私が住んでいる地域:
<INPUT TYPE=”RADIO” NAME=”国” VALUE=”AM”>アメリカ<BR>
<INPUT TYPE=”RADIO” NAME=”国” VALUE=”EU”>ヨーロッパ<BR>
<INPUT TYPE=”RADIO” NAME=”国” VALUE=”AS”>アジア<BR>
<入力タイプ=”送信” 値=”送信”>
</FORM>
ユーザーは複数の項目のうち 1 つしか選択できないため (そのため、同じ名前が付けられています)、戻り値は 1 つだけ取得され、ブラウザーは選択されたコントロールの値のみを送信できます。したがって、このフォームのユーザーが「Europez」を選択した場合、このエントリが取得され、その値はフォーム セットをトラバースすることによって取得されます。
Country = EU
コントロールごとに異なる VALUE 属性が提供されるため、値が反映されます。各エントリに対応する国または地域の名前。 VALUE 属性が省略された場合、ブラウザは値「on」を返すため、次のようになります。
Country = on
これはあまり使用されないため、VALUE 属性は通常、同じ名前のラジオ コントロールに使用されます。
b) HTML チェック ボックス コントロール
フォーム内の HTML ソース コードにチェック ボックス コントロールが含まれる場合、通常は、
<FORM ACTION="show_request.asp" METHOD="POST">
のように一意の名前が付けられます。
楽しんでいます:
<INPUT TYPE=”CHECKBOX” NAME=”読み方” CHECKED> 読み方
<INPUT TYPE=”CHECKBOX” NAME=”食べる”>食べる
<INPUT TYPE=”CHECKBOX” NAME=”Sleeping”> 睡眠中
<入力タイプ=”送信” 値=”送信”>
</FORM>
この場合、フォームを送信するときに、最初と 3 番目のチェック ボックスのみがオン (マークされている) であれば、Form コレクションを走査すると、次の値が取得されます。
Reading = on
Sleeping = on
ただし、各チェックボックスに値を指定すると、文字列「on」の代わりにこの値がサーバーに送信されます。たとえば、フォームは次のとおりです:
<FORM ACTION="show_request.asp" METHOD="POST">
楽しんでいます:
<入力タイプ=”チェックボックス” 値=”趣味025” 名前=”趣味”にチェック済み>_
水泳
<入力タイプ=”チェックボックス” 値=”趣味003” 名前=”趣味”にチェック済み>_
読む
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby068” NAME=”趣味”>食べること
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby010” NAME=”Hobby”>睡眠
<入力タイプ=”送信” 値=”送信”>
</FORM>
3 番目のチェック ボックスを除くすべてが送信された場合、Request.Form コレクションは次の結果を生成します:
Hobby = Hobby025, Hobby003, Hobby010
前述したように、より複雑なコレクション トラバーサル コードを作成すると (サブキーごとに個別に表示)
を実行すると、次の結果が得られます
。
サブキー 1 の値 = Hobby025
サブキー 2 の値 = Hobby003
サブキー 3 の値 = Hobby010
2 つの場合において、選択されていないコントロールは値をまったく返さないことに注意してください。最初のケースの結果には不正なカンマはなく、2 番目のケースには null 値はありません。これは、上記のテキスト ボックスを使用した同等のテストの結果とは異なります。テキスト ボックスを使用する場合、各テキスト ボックスは空の文字列を含む値を返します。これはブラウザが原因で発生します。したがって、ASP コードでコレクションにアクセスするときは、この問題に注意する必要があります。
上記の状況の注意が必要な副作用は、チェックボックスを使用する場合、チェックボックスの値のインデックスが元の HTML 内のコントロールの位置と関係がないことです。上記の例では、4 番目のチェックボックスのサブキー番号は 3 です。これは、フォームが送信されるときに 2 番目のコントロールが選択されていないためです。
c) HTML リスト コントロール
HTML の <SELECT> タグは、興味深いハイブリッド方法で値が表現される標準のドロップダウン リスト ボックスを生成するために使用されます。次のフォームは、ユーザーが選択できる 5 つの値で作成されています。MULTIPLE 属性が含まれているため、Shift キーまたは Ctrl キーを押しながら選択すると、複数のエントリを選択できます。
<FORM ACTION=”show_request.asp” METHOD=”POST”>
<SELECT NAME=”ホビー” SIZE=”5” マルチプル>
<OPTION VALUE=”Hobby001”>プログラミング</OPTION>
<OPTION VALUE=”Hobby025”>水泳</OPTION>
<OPTION VALUE=”Hobby003”>読書</OPTION>
<OPTION VALUE=”Hobby068”>食べる</OPTION>
<OPTION VALUE=”Hobby010”>睡眠</OPTION>
</SELECT><P>
<入力タイプ=”送信” 値=”送信”>
</FORM>
は、選択された値 (単一の <OPTION> タグで指定された VALUE 属性) をカンマで区切って含む、Form コレクション内の単一のエントリを返します。
Hobby = Hobby025, Hobby003, Hobby010
ifもう少し複雑なセット トラバーサル コード (各サブキーを個別に表示) を使用すると、次
の結果が得られます。
サブキー 1 の値 = Hobby025
サブキー 2 の値 = Hobby003
サブキー 3 の値 = Hobby010
これは、同じ名前のチェックボックスに関する上記の状況と同じです。実際、SELECT リストは、対応する項目を選択する (チェックしない) ためのチェック ボックスのリストと考えることができます。
ただし、リスト ボックスには、<OPTION> タグに VALUE 属性を設定すると、選択したオプションのテキスト コンテンツが取得されます。Hobby
= Swimming、
などの項目が含まれます。読書、睡眠
、同様に、より複雑なコレクション反復コードでは、次のような結果が返されます
。
サブキー 1 の値 = 水泳
サブキー 2 の値 = 読み取り値
サブキー 3 の値 = Sleeping
もちろん、単一の項目が選択され、VALUE 属性が <OPTION> に指定されている場合、結果には
Hobby = Hobby025 のみが含まれます。VALUE
属性が指定されていない場合、結果は
Hobby =
になります。スイミング。
これにより、Provincial (つまり、VALUE なし) がオプションのテキストを表示し、対応する変更を行うことができます。後者の場合は、(説明的な文字列を) 表示し、まったく異なるコンテンツを渡す場合 (短いコードを使用して説明的な文字列を表す場合など) など、特定の状況で非常に便利です。
d) HTML 送信および画像コントロールの
チェックボックスとラジオ ボタンは、チェックまたは選択されたときに「オン」を返すブール コントロールの例です。テキスト ボックスや他のほとんどの HTML コントロールとは異なり、ブラウザにはチェックされていないコントロールまたは選択されたコントロールは含まれません。選択されていません。
HTML ボタンと呼ばれる、よく使用されるもう 1 つのブール コントロールがあります。 <INPUT TYPE="SUBMIT">、<INPUT TYPE="RESET">、<INPUT TYPE="IMAGE">、<INPUT TYPE="BUTTON">、<BUTTON>...</BUTTON> タイプなど。
BUTTON タイプのコントロールは、フォームに直接影響を与えないため、値を返しません。フォームの呼び出しに使用される Submit メソッドを使用した場合でも、ブラウザーはリクエストに BUTTON タイプ コントロールの値を含めません。同様に、<INPUT TYPE="RESET"> ボタンの値がサーバーに送信されることはありません。
ただし、タイプ SUBMIT および IMAGE の入力ボタン コントロールは実際にフォームをサーバーに送信し、その VALUE プロパティにはフォームの他のコントロールの値が含まれます (HTML 定義に NAME 属性が含まれている限り)。たとえば、次のフォームは、ユーザーがプロセスをステップ実行したりキャンセルしたりできるウィザード タイプの Web アプリケーションの一部である可能性があります:
<FORM ACTION="show_request.asp" METHOD="POST">
<入力タイプ=”送信” 名前=”btnSubmit” 値=”次へ”>
<INPUT TYPE=”SUBMIT” NAME=”btnSubmit” VALUE=”前へ”>
<INPUT TYPE=”SUBIMT” NAME=”btnSubmit” VALUE=”Cancel”>
</FORM>
フォームには複数の SUBMIT ボタンを含めることができます。この場合、上に示したように、各ボタンに一意の VALUE 属性を与える必要があります。フォームが送信されると、Request.Form コレクションの値をトラバースすると、フォームを送信するためにどのボタンが押されたかに応じた値が生成されます。ユーザーが「前へ」ボタンを押すと、次の結果が得られます:
btnSubmit = Previous
したがって、Request.Form コレクションをクエリして、次に表示されるページを決定できます。次に
例を示します。 Select Case Request.Form("btnSubmit")
ケース「次へ」
応答.リダイレクト「page_3.asp」
ケース「前」
応答.リダイレクト「page_1.asp」
「キャンセル」の場合
Response.Redirect "main_menu.asp"
End Select
同時に、必要に応じて各ボタンに異なる NAME 属性を使用することもできます。そして、値が Form コレクションに含まれるコントロール名を選択します。以下の図に示すように、コントロールに完全なマークアップがなく、代わりに長いテキスト ラベルが続く状況で非常に役立ちます。
この画面のインターフェイスは、次のコードによって生成されます:
<FORM ACTION="show_request.asp" METHOD="POST">
<B>これから何をしたいですか?</B><P>
<INPUT TYPE=”SUBMIT” NAME=”btnNext” VALUE= ”>次のページへ進む<P>
<INPUT TYPE=”SUBMIT” NAME=”btnPrevious” Value=” ”> 前のページに戻る<P>
<INPUT TYPE=”SUBMIT” NAME=”btnCancel” VALUE=” ”>キャンセルしてメインメニューページに戻ります<P>
</FORM>
ASP ページでは、データを受信した後、ボタン名によって提供される値を確認して、どのボタンが押されたかを判断できます。
If Len(Request.Form(“btnNext”)) then Response.Redirect “page_3.asp”
If Len(Request.Form(“btnPrevious”)) then Response.Redirect “page_1.asp”
If Len(Request.Form("btnCancel")) then Response.Redirect "main_menu.asp"
このジョブは、キーの ASP コレクションにクエリを実行し、キーが存在しない場合は空の文字列を返します。つまり、2 番目のボタン (前のページ) が押された場合、Request.Form("btnNext") の値は空の文字列になり、その長さはエラーを生成せずにゼロになります。 2 番目のボタンが押されると、Form コレクションのこのエントリの値、Request.Form("btnPrevious") は " " になり、その長さは 0 より大きくなります。
e) Request コレクションの使用効率を向上します。
値をダウンロードするための ASP コレクションへのアクセスは、関連コレクションの一連の検索を必要とするため、時間と計算量が多くかかるプロセスであり、ローカル変数にアクセスするよりもはるかに時間がかかります。したがって、コレクション内の値をページ上で複数回使用する予定がある場合は、次のようにローカル変数として保存することを検討する必要があります。
strTitle = Request.Form("Title")
strFirstName = Request.Form("名")
strLastName = Request.Form("姓")
Len(stTitle) の場合、strTitle = strTitle & “ “
strFirstName = " " の場合
StrFullName = strTitle & " " & strLastName
ElseIf Len(strFirstName) = 1 then
StrFullName = strTitle & strFirstName & “・” & strLastName
それ以外
StrFullName = strTitle & strFirstName & " " & strLastName
End If
f) すべての Request コレクションを検索する
場合によっては、値のキー名が Request コレクションに表示されることはわかりますが、それがどのコレクションであるかは正確にはわかりません。たとえば、複数のページ (またはページの異なるセクション) が同じ ASP スクリプトに値を送信する場合、その値は Form または QueryString コレクションに表示されることがあります。
値が異なるコレクションに表示される理由を確認するには、<A> ハイパーリンク要素を使用してページが要求された状況を考えてください。この場合、リクエストに値を追加する唯一の方法は、値を URL に追加することです。ただし、同じ値が別のページの <FORM> または同じページの別の部分にすでに表示されている可能性があります
。
<FORM ACTION=”process_page.asp” METHOD=”POST”>
<INPUT TYPE=”SUBMIT” NAME=”page” VALUE=”次へ”>
<INPUT TYPE=”SUBMIT” NAME=”page” VALUE=”前へ”>
<INPUT TYPE=”SUBMIT” NAME=”page” VALUE=”ヘルプ”>
</フォーム>
...
...
ヘルプが必要な場合は、<A HREF=”process_page.asp?page=Help”>ヘルプ ページ</A>をご覧ください。
...
この場合、フォーム上の [ヘルプ] ボタンを押すと、Request.Form コレクションから名前と値のペア「page=Help」が送信されます。ただし、<A> ハイパーリンクを押すと、名前/値 "Page=Help" が送信される場合もありますが、今回は QueryString コレクション内にあります。この値にアクセスするには、ASP リクエスト オブジェクトの特別な機能を使用します。
strPage = Request("page")
これは、最初に一致する値の名前が見つかるまで、コレクション全体 (QueryString、Form、Cookies、ClientCertificate、ServerVariables) を順番に検索します。そうすることは、適切なコレクションに直接アクセスするよりも効率が低く、値が別のコレクションに表示されないという絶対的な保証がない限り安全ではありません。
たとえば、すべてのクエリに表示される Request.ServerVariables コレクションで "SERVER_NAME" を検索して、クライアントの要求を満たす Web サーバーの名前を収集するとします。ただし、他のコレクションにも「server_name」という名前の値が含まれている場合 (キー名は大文字と小文字が区別されないことに注意してください)、Request("server_name") を使用すると、誤った結果が得られます。 Reqeust.ServerVariables("server_name") 構文を使用すると、エラーを追跡するのが困難になります。
要約すると、「すべてのコレクションを検索」手法は細心の注意を払い、他の手法で必要な結果が得られない場合にのみ使用してください。
g) 他のコレクションにアクセスする
この記事のこのセクションでは、おそらく最もよく使用される Form コレクションに焦点を当てました。ただし、これらのテクニックはすべて他のオブジェクトにも同様に適用できます。これには、Request オブジェクトによって提供されるコレクション (つまり、Form、QueryString、Cookie、ServerVariables、および ClientCertificate) コレクション、および Response オブジェクトによって提供される Cookie (および他のオブジェクトによって提供されるコレクション) が含まれます。
値を QueryString コレクションに入力する方法と、その利点と欠点を簡単に説明します。ただし、以下で説明するように、両方の Cookie セットには、Cookie の使用をより便利にする追加機能があります。