相關(guān)鏈接: 中國安全網(wǎng) 中國質(zhì)量網(wǎng) 中國論文網(wǎng) 中國資訊網(wǎng)
下圖所示為該頁面,顯示的是選中了三個(gè)條目。
這種特殊的情況返回的是在Form集合中單個(gè)條目,它包含選擇的值(單個(gè)的標(biāo)記中指定的VALUE屬性),用逗號(hào)分隔:
Hobby = Hobby025, Hobby003, Hobby010
假如使用更加復(fù)雜一些的集合遍歷代碼(單獨(dú)顯示每個(gè)子鍵),將得到:
Hobby:
Subkey 1 value = Hobby025
Subkey 2 value = Hobby003
Subkey 3 value = Hobby010
這與上述相同名稱的復(fù)選框的情況相同。事實(shí)上可以認(rèn)為一個(gè)SELECT列表是一列復(fù)選框的列表供選擇(不是選中)相應(yīng)的條目。
然而,列表框也有指定的值,假如在標(biāo)記中設(shè)置VALUE屬性,將得到的是選擇的選項(xiàng)的文本內(nèi)容,Request.Form集將包含這樣一個(gè)項(xiàng)目:
Hobby = Swimming, Reading, Sleeping
并且,同樣,復(fù)雜一些的集合遍歷代碼將返回如下結(jié)果:
Hobby:
Subkey 1 value = Swimming
Subkey 2 value = Reading
Subkey 3 value = Sleeping
當(dāng)然,假如單個(gè)項(xiàng)目被選擇,且在中提供了VALUE屬性,得到結(jié)果包含的僅是:
Hobby = Hobby025
如果沒有提供VALUE屬性,得到:
Hobby = Swimming
這允許既可以缺。礋oVALUE)顯示選項(xiàng)文本,也可做相應(yīng)的改變。后一種情況在某些情況下是極為有用的,如要顯示(一個(gè)說明的字符串)和傳遞一個(gè)完全不同的內(nèi)容(如用一個(gè)短碼代表一個(gè)說明性的字符串)。
d) HTML提交和圖像控件
復(fù)選框和單選框是布爾型控件的例子,選中或選擇返回的為“on”,不像文本框和大多數(shù)其他的HTML控件,瀏覽器不包含沒有選中或沒有選擇的控件的值。
還有另外一種常用的布爾型控件,稱為HTML按鈕。如、、、和...類型。
BUTTON類型的控件不返回任何值,因其對窗體沒有直接的影響。即使使用用來調(diào)用窗體的Submit方法,瀏覽器在任何請求中將不包含BUTTON類型控件的值。同樣,一個(gè)按鈕的值也決不會(huì)發(fā)往服務(wù)器。
然而,輸入按鈕控件SUBMIT和IMAGE類型實(shí)際提交窗體給服務(wù)器,其VALUE屬性包含窗體的其他控件的值(只要在HTML定義中包含一個(gè)NAME屬性)。例如,這個(gè)窗體可能是向?qū)ь愋蚖eb應(yīng)用程序的一部分,允許用戶一步步進(jìn)行或取消進(jìn)程:
在一個(gè)窗體中,可以包括多個(gè)SUBMIT按鈕。在這種情況下,應(yīng)該給每一個(gè)按鈕唯一的VALUE屬性,如上所示。當(dāng)一個(gè)窗體被提交時(shí),遍歷Request.Form集合的值,將產(chǎn)生一個(gè)值,這個(gè)值依賴于按下哪個(gè)按鈕用于提交這個(gè)窗體。假如用戶按下的“Previous”按鈕,將得到:
btnSubmit = Previous
因此,可查詢Request.Form集合來決定下一個(gè)顯示的頁面,例如:
Select Case Request.Form(“btnSubmit”)
Case “Next”
Response.Redirect “page_3.asp”
Case “Previous”
Response.Redirect “page_1.asp”
Case “Cancel”
Response.Redirect “main_menu.asp”
End Select
同時(shí),也可根據(jù)需要對每個(gè)按鈕使用不同的NAME屬性。且選擇其值包含在Form集合中的控件名稱。在控件沒有一個(gè)完整的標(biāo)記而是隨后跟著較長的文本標(biāo)簽的情況下,極為有用,如下圖所示。
此屏幕上的界面由下列代碼產(chǎn)生:
What do you want to do now?
Go on the next page
GO back to the previous page
Cancel and go back to the main menu page
在ASP頁面中,接收到數(shù)據(jù)后,可以檢查按扭名稱提供的值來判斷按下的是哪個(gè)按鈕。
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”
這個(gè)工作是查詢一個(gè)鍵上的ASP集合,如果不存在則返回一個(gè)空的字符串。換句話說,如果第二個(gè)按鈕(previous頁)按下,則Request.Form(“btnNext”)的值是一個(gè)空字符串,則其長度為零而不至于產(chǎn)生一個(gè)錯(cuò)誤。當(dāng)?shù)诙䝼(gè)按鈕按下時(shí),則在Form集合中這個(gè)條目的值Request.Form(“btnPrevious”),將是“ ”其長度大于零。
e) 提高使用Request集合的效率
訪問一個(gè)ASP集合來下載一個(gè)值是費(fèi)時(shí)的需計(jì)算資源的過程,因?yàn)檫@個(gè)操作包含了一系列對相關(guān)集合的搜索,這比訪問一個(gè)局部變量要慢得多。因此,如果打算在頁面中多次使用集合中的一個(gè)值,應(yīng)該考慮將其存貯成為一個(gè)局部變量,例如:
strTitle = Request.Form(“Title”)
strFirstName = Request.Form(“FirstName”)
strLastName = Request.Form(“LastName”)
If Len(stTitle) Then strTitle = strTitle & “ “
If strFirstName = “ “ Then
StrFullName = strTitle & “ “ & strLastName
ElseIf Len(strFirstName) = 1 Then
StrFullName = strTitle & strFirstName & “· “ & strLastName
Else
StrFullName = strTitle & strFirstName & “ ” & strLastName
End If
f) 搜索所有的Request集合
在某些情況下,可能知道一個(gè)值的鍵名將出現(xiàn)在Request集合中,但不能準(zhǔn)確地知道是哪一個(gè)集合。例如,假如有幾個(gè)頁面(或一個(gè)頁面的不同段)發(fā)送一個(gè)值給同一個(gè)ASP腳本,它可能在Form或者QueryString集合中出現(xiàn)。
本章后面部分將研究Form和QueryString集合的差異。
要看一下一個(gè)值為什么可能出現(xiàn)在不同的集合中,考慮一下這種情況:使用了超級鏈接元素請求一個(gè)頁面。在這種情況下,增加一個(gè)值到請求的唯一方法是把它加到URL上。然而,同樣的值可能已出現(xiàn)在另一個(gè)頁面的中,或同一頁面不同部分:
...
...
...
For help go to the Help Page
...
在這種情況下,按下窗體上的Help按鈕,將發(fā)送Request.Form集合中一對名稱/值“page=Help”。然而,按下超級鏈接也可能發(fā)送名稱/值“Page=Help”,但是這次卻是在QueryString集合里。為訪問這個(gè)值,可使用ASP Request對象的一個(gè)特殊功能:
strPage = Request(“page”)
這將按序搜索全部的集合——QueryString、Form、Cookies、ClientCertificate、ServerVariables,直到發(fā)現(xiàn)第一個(gè)匹配值的名稱。這樣做比直接訪問適當(dāng)?shù)募闲实停⑶沂遣话踩,除非能絕對保證這個(gè)值不會(huì)出現(xiàn)在另外一個(gè)集合中。
例如,可能希望搜集滿足客戶請求的Web服務(wù)器的名稱,這通過出現(xiàn)在每個(gè)查詢中的Request.ServerVariables集合中尋找“SERVER_NAME”來實(shí)現(xiàn)。然而,假如任一其他的集合也包含名為“server_name”的值(記住鍵名不區(qū)分大小寫),當(dāng)使用Request(“server_name”)時(shí),得到的是錯(cuò)誤的結(jié)果。使用Reqeust.ServerVariables(“server_name”)句法,我們將很難進(jìn)行錯(cuò)誤追蹤。
總而言之,使用“搜索全部集合”技術(shù)要格外小心,且只在沒有其他技術(shù)能夠提供你需要的結(jié)果時(shí)使用。
g) 訪問其他的集合
本章的這一節(jié)里,已經(jīng)集中討論了Form集合,這可能是使用得最多的一個(gè)。然而,所有這些技術(shù)同樣適用于其他的對象。包括那些由Request對象提供的(即Form、QueryString、Cookies、ServerVariables和ClientCertificate)集合,及由Response對象提供的cookies(及將在下兩章遇到的其他對象提供的集合)。
我們將簡短了解一個(gè)值如何進(jìn)入一個(gè)QueryString集合,及其優(yōu)點(diǎn)和不足。然而,同時(shí)這兩個(gè)Cookies集合有額外的功能,可以使使用cookie更加方便,下面討論這個(gè)內(nèi)容。