文本型單頁面ASP.NET計數器
2024-07-10 13:07:34
供稿:網友
 
看到一個非常簡單的計數器,也許會很有用
前面我介紹了system.io空間下的文件操作對象,這里我講解一下如何制作應用于特定頁面的計數器。每個計數器都需要一個相應的文件來存儲當前的訪問量,那么如何建立用來技術的文件、如何對技術文件進行讀寫以及如何顯示當前訪問量是我們需要解決的問題。
首先 獲取技術文件
因為是單頁面計數器,并不應用于特定頁面,所以必須能根據當前頁面的不同而獲取或者生成不同的技術文件。最好把技術文件和頁面起相同的名字起不同的擴展名。
我們把獲取計數器文件部分的代碼包裝成一個函數:
function mike_getfilename() as string
dim mike_path as string
dim mike_position as integer
mike_path=request.servervariables("path_translated")
mike_position=instrrev(mike_path,".")
mike_getfilename=mid(mike_path,1,mike_position) & "count"
end function
使用request對象的servervariables("path_translated")方法來獲取當前頁面的絕對路徑。
instrrev函數返回某字符串在另一個字符串中出現的從結尾計起的位置
mid函數用于從字符串中返回指定數目的字符 mid(string, start[, length])
參數
string:字符串表達式,從中返回字符。如果 string 包含 null,則返回 null。
start:string 中被提取的字符部分的開始位置。如果 start 超過了 string 中字符的數目,mid 將返回零長度字符串 ("")。
length:要返回的字符數。如果省略或 length 超過文本的字符數(包括 start 處的字符),將返回字符串中從 start 到字符串結束的所有字符
使用mid(mike_path,1,mike_position)將當前頁面的文件名和.一起截取下來,然后把我們定義的擴展名連到串上,就得到了我們需要的計數文件名。
 
然后 讀取計數文件
下面我們要進行的操作是對計數文件進行讀寫操作,首先我們使用先前定義的mike_getfilename()函數得到當前文件名:
dim mike_pathname as string
mike_pathname=mike_getfilename()
實例化一個對該文件的讀取通道,即創建一個filestream對象:
mike_stream=new filestream(mike_pathname,filemode.openorcreate,fileaccess.read)
防止出現異常即該頁面第一次被訪問,計數文件使用openorcreate創建。
下面使用streamreader對象對文件進行讀取操作:
mike_readobj=new streamreader(mike_stream)
mike_str=mike_readobj.readline()
mike_readobj.close()
這里我們應用到了前面介紹過的streamreader對象的構造函數生成streamreader對象,然后使用readline()方法來讀取文件內容,需要特別注意的是
mike_readobj.close()
這個語句很重要,否則當前計數文件就一直被streamreader對象獨占,下面對文件進行寫操作時就會失敗,所以必須使用close()方法釋放被streamreader對象占用的文件和系統資源。
其次 顯示當前訪問量
當前訪問量可以采用response.write()方法來顯示,這種方法的缺點是不能調整計數器的顯示位置。這里我們利用asp.net中的服務器控件label,在業務邏輯代碼區設置該控件的text屬性。這樣就體現出業務邏輯和頁面邏輯代碼分離的優勢,不過畢竟還是在一個文件中,我個人推薦用代碼后置即前臺頁面放在aspx文件,后臺文件保存成一個類文件。
count=cint(mike_str)
count+=1
mikecat.text=count
我們通過streamreader讀取出來的計數文件轉換為數值,然后計數值加1,再在label控件顯示出來。此時的mikecat就是label控件。
最后 寫入計數器文件
進行寫入操作之前仍需要建立一個寫入通道:
mike_stream=new filestream(mike_pathname,filemode.open,fileaccess.write)
由于此時計數文件已經存在因此我們僅用到了filemode.open
我們使用streamwriter對象的構造函數來生成一個streamwriter對象來進行文件寫操作:
mike_writerobj=new streamwriter(mike_stream)
mike_writerobj.writeline(count)
mike_writerobj.close()
 
下面給出全部計數器代碼,大家可以了解一下其中細節
<%@ page language="vb" debug="true" explicit="true"%>
<%@ import namespace="system.io" %>
<html>
<head>
<title> new asp.net document </title>
</head>
<body bgcolor="#ffffff" topmargin="0" marginheight="0">
<script runat="server" language="vb">
sub page_load(source as object, e as eventargs)
 if not page.ispostback then
 dim count as integer
 dim mike_stream as filestream
 dim mike_pathname,mike_str as string
 dim mike_readobj as streamreader
 dim mike_writerobj as streamwriter
 mike_pathname=mike_getfilename()
 mike_stream=new filestream(mike_pathname,filemode.openorcreate,fileaccess.read)
 mike_readobj=new streamreader(mike_stream)
 mike_str=mike_readobj.readline()
 mike_readobj.close()
 count=cint(mike_str)
 count+=1
 mikecat.text=count
 mike_stream=new filestream(mike_pathname,filemode.open,fileaccess.write)
 mike_writerobj=new streamwriter(mike_stream)
 mike_writerobj.writeline(count)
 mike_writerobj.close()
 end if
end sub
function mike_getfilename() as string
 dim mike_path as string
 dim mike_position as integer
 mike_path=request.servervariables("path_translated")
 mike_position=instrrev(mike_path,".")
 mike_getfilename=mid(mike_path,1,mike_position) & "count"
end function
</script>
<form runat="server" method="">
<asp:label id="mikecat" runat="server"/>
</form>
 
</body>
</html>
=======================================
我們這里稍加修改即成為漂亮的圖形計數器,兩種計數器在文件讀寫方面完全一致。
在asp.net中用于裝載圖片的控件是image控件,因此下面就采用動態生成image控件的方法來實現動態生成圖形。這個容器我們采用<div id="mike_div" runat="server"/>
這里我們需要準備10張圖,分別是0~9十個數字的圖片(取名0~9.gif),我們采用下面的方法動態生成圖像:
dim mike_img as image
dim mike_graph as string
dim i as integer
count=cint(mike_str)+1
for i=1 to len(count)
mike_img=new image()
mike_graph=mid(count,i,1)
mike_img.imageurl=mike_graph & ".gif"
mike_div.controls.add(mike_img)
next
 
首先我們根據當前的計數字符串的長度來決定需要生成的圖形的長度。 new 指令來動態生成image控件,然后用imageurl屬性指定要顯示的圖片路徑。最后使用mike_div的add方法將當前生成的image控件加入到容器的控件集合中。