明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

asp編程案例:在ASP中完成購(gòu)物小車(chē)

[摘要]為了講解方便,突出重點(diǎn),本文用數(shù)組實(shí)現(xiàn)要顯示的商品信息。但在實(shí)際的系統(tǒng)開(kāi)發(fā)中,這些商品信息的數(shù)據(jù)應(yīng)該來(lái)自后臺(tái)數(shù)據(jù)庫(kù)。   在程序中,我們定義了一個(gè)sp數(shù)組并對(duì)其賦值,然后用一個(gè)循環(huán)實(shí)現(xiàn)其數(shù)據(jù)顯示及對(duì)下一個(gè)程序的數(shù)據(jù)傳遞。程序部分代碼如下: <% i=1 do while (i<=5) %> <tr...
    為了講解方便,突出重點(diǎn),本文用數(shù)組實(shí)現(xiàn)要顯示的商品信息。但在實(shí)際的系統(tǒng)開(kāi)發(fā)中,這些商品信息的數(shù)據(jù)應(yīng)該來(lái)自后臺(tái)數(shù)據(jù)庫(kù)。
  在程序中,我們定義了一個(gè)sp數(shù)組并對(duì)其賦值,然后用一個(gè)循環(huán)實(shí)現(xiàn)其數(shù)據(jù)顯示及對(duì)下一個(gè)程序的數(shù)據(jù)傳遞。程序部分代碼如下:
<% i=1
do while (i<=5) %>
<tr > <td><%=sp(i)%></td>
<td><a href=“cart.asp?spid=<%=sp(i)%>”>訂購(gòu)</a></td> </tr>
<% i=i+1
loop %> 

   構(gòu)建購(gòu)物小車(chē)
  為處理用戶訂購(gòu)商品的操作,我們自定義了兩個(gè)Session的屬性,分別是“spid”(用來(lái)保存商品名稱(chēng))和“num”(用來(lái)保存相應(yīng)商品的訂購(gòu)數(shù)量)。當(dāng)用戶訂購(gòu)了一種商品后,我們分三種情況對(duì)Session進(jìn)行處理:
●購(gòu)物小車(chē)為空,即Session(“spid")=“",直接將spid與num加入Session;
●購(gòu)物小車(chē)非空且當(dāng)前訂購(gòu)的商品是購(gòu)物小車(chē)中沒(méi)有的,則處理方法同上;
●購(gòu)物小車(chē)非空但當(dāng)前訂購(gòu)的商品是購(gòu)物小車(chē)中已有的,Session保持不變。
程序?qū)崿F(xiàn)的要點(diǎn)是如何判別當(dāng)前訂購(gòu)的商品在購(gòu)物小車(chē)中是否存在,因此,首先要將Session變量的內(nèi)容拆分并存入數(shù)組:
array1=split(Session(“spid”),“:”)
然后用循環(huán)語(yǔ)句判別array1中是否有元素與傳遞來(lái)的spid相同并將結(jié)果存入變量ifbuy:
for i=0 to ubound(array1)-1
if array1(i)= Request.QueryString(“spid”) then
ifbuy=true
exit for
end if
next

將新增的商品信息加入Session:
Session(“spid”)=Session(“spid”)& Request.
QueryString(“spid”)&“:”
Session對(duì)象的另一個(gè)自定義屬性num的處理同spid相同。
    購(gòu)物小車(chē)的顯示
  顯示用戶已經(jīng)購(gòu)買(mǎi)的商品信息,即是顯示Session變量的內(nèi)容。只要將Session變量的內(nèi)容拆分,存入數(shù)組中,再顯示數(shù)組的內(nèi)容即可。購(gòu)物小車(chē)的顯示界面如圖1所示,其中“數(shù)量”欄的類(lèi)型為“text",“取消本商品”欄的類(lèi)型為“checkbox”。這兩欄的數(shù)據(jù)是可以變動(dòng)的,在“取消本商品”欄中打“√”,再按“重新計(jì)算”,將在購(gòu)物小車(chē)中取消該商品。



圖1

“重新計(jì)算”和“繼續(xù)購(gòu)買(mǎi)”兩個(gè)命令按鈕用JavaScript實(shí)現(xiàn):
<script language=“JavaScript">
<!--
function onback(theForm)
{window.history.back() }
function recal(theForm)
{theform.action=“modifycart.asp" }
-->
</script>


實(shí)現(xiàn)顯示購(gòu)物小車(chē)的代碼如下:
<%
dim k
array1=split(Session(“spid”),“:”)
array2=split(Session(“num”),“:”)
k=0
do while k<ubound(array1) %>
<tr>
<td><p align=“center”><%=array1(k)%>
</p></td>
<td><p><input type=“text” name=“t1” size=“10” value=“<%=array2(k)%>”></p></td>
<td><p><input type=“checkbox” name=
“ifcancel” value=<%=k%> ></p></td></tr>
<% k=k+1
loop %>
<tr>
<td align=center height=“42” colspan=“2”>
<input type=“submit” name=“submit” value=“重新計(jì)算”
onclick=“return recal(this.form)”></td>
<td align=center height=“42” colspan=“3”>
<input type=“submit” name=“Submit” value=“繼續(xù)購(gòu)買(mǎi)”
onclick=“return onback(this.form)”></td>
</tr>
   購(gòu)物小車(chē)的修改
  在用戶點(diǎn)擊“重新計(jì)算”按鈕后,需要對(duì)購(gòu)物小車(chē)的內(nèi)容進(jìn)行修改,包括對(duì)數(shù)量的修改和將被取消的商品從Session中刪除。
  對(duì)于數(shù)量的修改,只要將文本框中被變動(dòng)過(guò)的數(shù)據(jù)重新存入Session中即可:
<%
’首先將保存在Session變量中的訂購(gòu)數(shù)量提取出來(lái)
array=split(Session(“num”),“:”)
’將文本框t1中商品的數(shù)量提取出來(lái),存入array數(shù)組中
if Request.Form(“t1”)<>“”then
Session(“num”)=“”
j=0
for each item in Request.Form(“t1”)
array(j)=item
j=j+1
next
’將提交后的商品數(shù)量放入Session變量中
for i=0 to ubound(array)-1
Session(“num”)=Session(“num”)&array(i)&“:”
next
end if %>

  要從Session中刪除被選中的商品,首先要取得“checkbox”的返回值,它用來(lái)定位被取消的商品在Session變量中的位置!癱heckbox”的返回值k是一個(gè)循環(huán)變量,是商品所在行的行數(shù),其實(shí)也就是被選中商品在Session中的位置。如果不加返回值定義的話,“checkbox”的返回值是按自然數(shù)順序排列的。例如,在圖1所示的情況下,如果“電視機(jī)”和“書(shū)籍”兩行被選中,若是“checkbox”不加返回值定義,它的返回值將分別為1和2,這樣就會(huì)導(dǎo)致把“電視機(jī)”和“鋼筆”從Session中刪除的錯(cuò)誤。
<% dim array1,array2,ifcancel(20),m1,m2,i,j
array1=split(Session(“spid”),“:”)
array2=split(Session(“num”),“:”)
m1=ubound(array1)-1
m2=ubound(array2)-1
’保存復(fù)選框checkbox的值
for i=1 to Request.Form (“ifcancel”).Count
ifcancel(i)=Request.Form (“ifcancel”)(i)
next
for i=1 to Request.Form (“ifcancel”).Count
’將checkbox選中的spid和num從Session中去掉
for j=ifcancel(j) to m1-1
array1(j)=array1(j+1)
array2(j)=array2(j+1)
next
’將總數(shù)減1,并將后面的checkbox的值減1
m1=m1-1
for p=i to Request.Form (“ifcancel”).Count
ifcancel(p)=ifcancel(p)-1
next
’將處理后的spid和num放回Session
Session(“spid”)=“”
Session(“num”)=“”
for j=0 to m1
Session(“spid”)=Session(“spid”)&array1(j)&“:”
Session(“num”)=Session(“num”)&array2(j)&“:”
next
next %>

  本文重點(diǎn)說(shuō)明購(gòu)物小車(chē)的實(shí)現(xiàn)與修改,所以對(duì)數(shù)據(jù)進(jìn)行了簡(jiǎn)單化處理。在實(shí)際的商業(yè)系統(tǒng)中,對(duì)數(shù)據(jù)的處理要復(fù)雜得多,例如需要例外及安全驗(yàn)證等。