熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP中使用Form和QueryString集合

2013-11-13 10:40:18  來源: .NET編程 

  當用戶填寫頁面<FORM>內容時所提供的全部值或在浏覽器地址欄輸入在URL後的值通過Form和QueryString集合為ASP腳本所用這是在ASP代碼中訪問值的一種簡單方法

   訪問ASP集合的一般技術

  大多數ASP集合與在VB中見到的普通集合相差不多實際上它們是值的數組但能通過使用一個文本字符串鍵(對大小不敏感)以及一個整型索引進行訪問因此假如客戶端Web頁面包含的<FORM>如下

<FORM ACTION=”show_requestasp” METHOD=”POST”>
FirstName:<INPUT TYPE=”TEXT” NAME=”FirstName”>
LastName:<INPUT TYPE=”TEXT” NAME=”LastName”>
<INPUT TYPE=”SUBMIT” VALUE=”Send”>
</FORM>
  可通過訪問ASP的Form集合來訪問其控件內的值

strFirstName = RequestForm(“FirstName”)
strLastName = RequestForm(“LastName”)
  也可使用窗體中控件的整型索引索引的范圍從在HTML中第一個定義的控件開始然後根據定義的順序排序

strFirstName = RequestForm()
strLastName = RequestForm()
  然而後面的這種以整型為索引的技術不推薦使用因為一旦有HTML中的控件發生了變化或者插入一個新的控件則ASP代碼將得到錯誤的值進一步而言對於閱讀代碼的人來講極容易混淆

  ) 訪問集合的全部值

  可以通過引用集合把整個Form上的一系列值變成單個的字符變量且不用提供鍵或索引

StrAllFormContent = RequestForm
  假如文本框包含值Priscilla和Descartes則RequestForm語句將返回下列字符

FirstName=Priscilla&LastName=Descartes
  注意提供的值是以名稱/值對的形式出現的(即控件名稱=控件值)並且每一對名稱/值相互之間是用符號“&”相分隔的假如打算把窗體中的內容傳遞單獨的希望得到值的標准格式的可執行應用程序或DLL這個技術是很有用的然而一般說來都是通過以窗體中控件的名稱為文本鍵來訪問集合中的內容

  ) 遍歷一個ASP集合

  有兩種方式遍歷一個ASP集合中的所有成員方式與普通VB集合的基本相同每個集合提供一個Count屬性返回的是集合中條目數量可通過使用一個整型索引使用Count屬性來遍歷

For intLoop= To RequestFormCount
ResponseWrite RequestForm(intLoop) & “<BR>”
Next
  假如先前的窗體包含Priscilla和Descartes值的兩個文本框將得到如下結果

Priscilla
Descartes
  然而更好的方法是使用For EachNext結構

For Each objItem In RequestForm
ResponseWrite objItem & “=” & RequestForm(objItem) & “<BR>”
Next
  這帶來的好處是既可以訪問控件的名稱又可訪問其值上述代碼將得到如下結果

FirstName = Priscilla
LastName = Descartes
  注意一些浏覽器返回到ASP的<FORM>值可能與頁面上顯示的順序不盡相同

  ) 集合成員的多值性

  在某些情況下ASP集合中的各個成員可能不止一個值這種情況發生在HTML定義中有幾個控件有相同Name屬性時例如

<FORM ACTION=”Show_requestasp” METHOD=”POST”>
<INPUT TYPE=”TEXT” NAME=”OtherHobby”>
<INPUT TYPE=”TEXT” NAME=”OtherHobby”>
<INPUT TYPE=”TEXT” NAME=”OtherHobby”>
<INPUT TYPE=”SUBMIT” VALUE=”Send”>
</FORM>
  在Form集合中將為“OtherHobby”創建一個條目然而它將包括從三個文本框中得到的值假如在提交時用戶留下了一個或多個為空則返回的值為空字符串假如用戶在第一和第三個文本框分別輸入Gardening和Mountaineering第二個文本框為空在我們的ASP代碼中訪問RequestForm(“OtherHobby”)將返回字符串

Gardening Mountaineering

  為了能夠在這種情況下訪問單個值可以用復雜一些的代碼

For Each objItem In RequestForm
 If RequestForm(objItem)Count > Then ‘More than one value in this item ResponseWrite objItem & “:<BR>”
  For intLoop = To RequestForm(objItem)Count
   ResponseWrite “Subkey” & intLoop & “value = “& RequestForm(objItem) (intLoop) & “<BR>”
  Next
 Else
  ResponseWrite objItem & “ = ” & RequestForm(objItem) & “<BR>”
 End If
Next
  對於前面的包含三個OtherHobby控件的窗體實例這將返回

OtherHobby:
Subkey value = Gardening
Subkey value =
Subkey value = Mountaineering
  然而由於很少給多個文本框相同的名字因此這種技術很少用到

  a) HTML中的單選或選頁按鈕控件

  在HTML中需要給幾個控件相同的Name屬性的情況是單選(或選項)按鈕例如

<FORM ACTION=”show_requestasp” METHOD=”POST”>
I live in:
<INPUT TYPE=”RADIO” NAME=”Country” VALUE=”AM”>America<BR>
<INPUT TYPE=”RADIO” NAME=”Country” VALUE=”EU”>Europe<BR>
<INPUT TYPE=”RADIO” NAME=”Country” VALUE=”AS”>Asia<BR>
<INPUT TYPE=”SUBMIT” VALUE=”Send”>
</FORM>
  因為用戶只能選擇多項中的一個(這就是給它們相同的名字的原因)將僅得到一個返回值浏覽器只能發送所選擇控件的值因此假如這個窗體的用戶已經選擇了“Europez”將得到這個條目通過遍歷Form集得到其值

Country = EU

  由於為每個控件提供了不同的VALUE屬性反映了每個條目所對應的國家或地區的名稱假如省略了VALUE屬性浏覽器將返回的值為“on”因此將得到

Country = on

  這是不經常用到的因此一般對使用相同名稱的單選控件使用VALUE屬性

  b) HTML復選框控件

  當一個窗體中HTML源碼包含一個復選框控件時一般都給定唯一的名稱例如

<FORM ACTION=”show_requestasp” METHOD=”POST”>
I enjoy:
<INPUT TYPE=”CHECKBOX” NAME=”Reading” CHECKED> Reading
<INPUT TYPE=”CHECKBOX” NAME=”Eating”> Eating
<INPUT TYPE=”CHECKBOX” NAME=”Sleeping”> Sleeping
<INPUT TYPE=”SUBMIT” VALUE=”Send”>
</FORM>
  在這種情況下提交窗體時假如僅是第一和第三個復選框被選中(加標記)遍歷Form集合時會得到下列值

Reading = on
Sleeping = on
  然而假如為每個復選框提供一個值把這個值發往服務器代替字符串“on”例如窗體如下

<FORM ACTION=”show_requestasp” METHOD=”POST”>
I enjoy:
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby” NAME=”Hobby” CHECKED>_
Swimming
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby” NAME=”Hobby” CHECKED>_
Reading
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby” NAME=”Hobby”>Eating
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby” NAME=”Hobby”>Sleeping
<INPUT TYPE=”SUBMIT” VALUE=”Send”>
</FORM>
  如果除第三個復選框外全部提交在RequestForm集合會產生下列結果

Hobby = Hobby Hobby Hobby
  假如編寫更復雜一些集合遍歷代碼如先前所述(單獨顯示每個子鍵)就得到這樣結果

Hobby:
Subkey value = Hobby
Subkey value = Hobby
Subkey value = Hobby
  需要注意的是兩種情況沒有選中的控件根本不返回任何值在第一種情況的結果裡沒有欺騙性的逗號第二種情況也沒有空值這與上述的使用文本框的相當的測試的結果不一樣使用文本框時每個文本框都返回一個值即使是一個空字符串這是浏覽器造成這樣的結果因此在ASP代碼中訪問集合時要注意這個問題

  上述情況一個棘手的負作用是使用復選框時復選框值的索引與在原始的HTML中控件的位置沒有任何聯系在上述的例子中第四個復選框的子鍵數為因為當窗體提交時第二個控件沒有選中

  c) HTML列表控件

  HTML中的<SELECT>標記用來產生標准的下拉列表框其值以一種有趣的混合方式表示下列的窗體創建了包含個值可供用戶選擇由於包含了MULTIPLE屬性因此可以通過選擇時按下Shift或Ctrl鍵選擇不僅一個的條目

<FORM ACTION=”show_requestasp” METHOD=”POST”>
<SELECT NAME=”Hobby” SIZE=”” MULTIPLE>
<OPTION VALUE=”Hobby”>Programming</OPTION>
<OPTION VALUE=”Hobby”>Swimming</OPTION>
<OPTION VALUE=”Hobby”>Reading</OPTION>
<OPTION VALUE=”Hobby”>Eating</OPTION>
<OPTION VALUE=”Hobby”>Sleeping</OPTION>
</SELECT><P>
<INPUT TYPE=”SUBMIT” VALUE=”Send”>
</FORM>
  這種特殊的情況返回的是在Form集合中單個條目它包含選擇的值(單個的<OPTION>標記中指定的VALUE屬性)用逗號分隔

Hobby = Hobby Hobby Hobby
  假如使用更加復雜一些的集合遍歷代碼(單獨顯示每個子鍵)將得到

Hobby:
Subkey value = Hobby
Subkey value = Hobby
Subkey value = Hobby
  這與上述相同名稱的復選框的情況相同事實上可以認為一個SELECT列表是一列復選框的列表供選擇(不是選中)相應的條目

  然而列表框也有指定的值假如在<OPTION>標記中設置VALUE屬性將得到的是選擇的選項的文本內容RequestForm集將包含這樣一個項目

Hobby = Swimming Reading Sleeping
  並且同樣復雜一些的集合遍歷代碼將返回如下結果

Hobby:
Subkey value = Swimming
Subkey value = Reading
Subkey value = Sleeping
  當然假如單個項目被選擇且在<OPTION>中提供了VALUE屬性得到結果包含的僅是

Hobby = Hobby
  如果沒有提供VALUE屬性得到

Hobby = Swimming
  這允許既可以缺省(即無VALUE)顯示選項文本也可做相應的改變後一種情況在某些情況下是極為有用的如要顯示(一個說明的字符串)和傳遞一個完全不同的內容(如用一個短碼代表一個說明性的字符串)

  d) HTML提交和圖像控件

  復選框和單選框是布爾型控件的例子選中或選擇返回的為“on”不像文本框和大多數其他的HTML控件浏覽器不包含沒有選中或沒有選擇的控件的值

  還有另外一種常用的布爾型控件稱為HTML按鈕如<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_requestasp” METHOD=”POST”>
<INPUT TYPE=”SUBMIT” NAME=”btnSubmit” VALUE=”Next”>
<INPUT TYPE=”SUBMIT” NAME=”btnSubmit” VALUE=”Previous”>
<INPUT TYPE=”SUBIMT” NAME=”btnSubmit” VALUE=”Cancel”>
</FORM>
  在一個窗體中可以包括多個SUBMIT按鈕在這種情況下應該給每一個按鈕唯一的VALUE屬性如上所示當一個窗體被提交時遍歷RequestForm集合的值將產生一個值這個值依賴於按下哪個按鈕用於提交這個窗體假如用戶按下的“Previous”按鈕將得到

btnSubmit = Previous

  因此可查詢RequestForm集合來決定下一個顯示的頁面例如

Select Case RequestForm(“btnSubmit”)
Case “Next”
ResponseRedirect “page_asp”
Case “Previous”
ResponseRedirect “page_asp”
Case “Cancel”
ResponseRedirect “main_menuasp”
End Select
  同時也可根據需要對每個按鈕使用不同的NAME屬性且選擇其值包含在Form集合中的控件名稱在控件沒有一個完整的標記而是隨後跟著較長的文本標簽的情況下極為有用如下圖所示

  此屏幕上的界面由下列代碼產生

<FORM ACTION=”show_requestasp” METHOD=”POST”>
<B>What do you want to do now?</B><P>
<INPUT TYPE=”SUBMIT” NAME=”btnNext” VALUE= ”> Go on the next page<P>
<INPUT TYPE=”SUBMIT” NAME=”btnPrevious” Value=” ”> GO back to the previous page<P>
<INPUT TYPE=”SUBMIT” NAME=”btnCancel” VALUE=” ”> Cancel and go back to the main menu page<P>
</FORM>
  在ASP頁面中接收到數據後可以檢查按扭名稱提供的值來判斷按下的是哪個按鈕

If Len(RequestForm(“btnNext”)) Then ResponseRedirect “page_asp”
If Len(RequestForm(“btnPrevious”)) Then ResponseRedirect “page_asp”
If Len(RequestForm(“btnCancel”)) Then ResponseRedirect “main_menuasp”
  這個工作是查詢一個鍵上的ASP集合如果不存在則返回一個空的字符串換句話說如果第二個按鈕(previous頁)按下則RequestForm(“btnNext”)的值是一個空字符串則其長度為零而不至於產生一個錯誤當第二個按鈕按下時則在Form集合中這個條目的值RequestForm(“btnPrevious”)將是“ ”其長度大於零

  e) 提高使用Request集合的效率

  訪問一個ASP集合來下載一個值是費時的需計算資源的過程因為這個操作包含了一系列對相關集合的搜索這比訪問一個局部變量要慢得多因此如果打算在頁面中多次使用集合中的一個值應該考慮將其存貯成為一個局部變量例如

strTitle = RequestForm(“Title”)
strFirstName = RequestForm(“FirstName”)
strLastName = RequestForm(“LastName”)
If Len(stTitle) Then strTitle = strTitle & “ “
If strFirstName = “ “ Then
StrFullName = strTitle & “ “ & strLastName
ElseIf Len(strFirstName) = Then
StrFullName = strTitle & strFirstName & “· “ & strLastName
Else
StrFullName = strTitle & strFirstName & “ ” & strLastName
End If
  f) 搜索所有的Request集合

  在某些情況下可能知道一個值的鍵名將出現在Request集合中但不能准確地知道是哪一個集合例如假如有幾個頁面(或一個頁面的不同段)發送一個值給同一個ASP腳本它可能在Form或者QueryString集合中出現

  要看一下一個值為什麼可能出現在不同的集合中考慮一下這種情況使用了<A>超級鏈接元素請求一個頁面在這種情況下增加一個值到請求的唯一方法是把它加到URL上然而同樣的值可能已出現在另一個頁面的<FORM>中或同一頁面不同部分


<FORM ACTION=”process_pageasp” METHOD=”POST”>
<INPUT TYPE=”SUBMIT” NAME=”page” VALUE=”Next”>
<INPUT TYPE=”SUBMIT” NAME=”page” VALUE=”Previous”>
<INPUT TYPE=”SUBMIT” NAME=”page” VALUE=”Help”>
</FORM>


For help go to the <A HREF=”process_pageasp?page=Help”>Help Page</A>

  在這種情況下按下窗體上的Help按鈕將發送RequestForm集合中一對名稱/值“page=Help”然而按下<A>超級鏈接也可能發送名稱/值“Page=Help”但是這次卻是在QueryString集合裡為訪問這個值可使用ASP Request對象的一個特殊功能
strPage = Request(“page”)

  這將按序搜索全部的集合——QueryStringFormCookiesClientCertificateServerVariables直到發現第一個匹配值的名稱這樣做比直接訪問適當的集合效率低並且是不安全的除非能絕對保證這個值不會出現在另外一個集合中

  例如可能希望搜集滿足客戶請求的Web服務器的名稱這通過出現在每個查詢中的RequestServerVariables集合中尋找“SERVER_NAME”來實現然而假如任一其他的集合也包含名為“server_name”的值(記住鍵名不區分大小寫)當使用Request(“server_name”)時得到的是錯誤的結果使用ReqeustServerVariables(“server_name”)句法我們將很難進行錯誤追蹤
總而言之使用“搜索全部集合”技術要格外小心且只在沒有其他技術能夠提供你需要的結果時使用

  g) 訪問其他的集合

  本文的這一節裡已經集中討論了Form集合這可能是使用得最多的一個然而所有這些技術同樣適用於其他的對象包括那些由Request對象提供的(即FormQueryStringCookiesServerVariables和ClientCertificate)集合及由Response對象提供的cookies(及其他對象提供的集合)

  我們將簡短了解一個值如何進入一個QueryString集合及其優點和不足然而同時這兩個Cookies集合有額外的功能可以使使用cookie更加方便下面討論這個內容


From:http://tw.wingwit.com/Article/program/net/201311/14259.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.