用慣了C/S編程,經(jīng)常定義全局變量的時(shí)候,為了方便,而且下次調用某函數的時(shí)候仍能獲取到變量的值,我們經(jīng)常會(huì )定義static類(lèi)型的全局變量。
但是現在轉而B(niǎo)/S的編程,壞習慣自然而來(lái)的的沿用過(guò)來(lái)。每張頁(yè)面登錄的時(shí)候,用戶(hù)的基本信息全局變量全部都定義成了static類(lèi)型。結果,發(fā)現了一個(gè)嚴重的問(wèn)題。就是用戶(hù)張三登錄了,顯示的是張三的基本信息,然后張三用戶(hù)添加了一條記錄。照例說(shuō)列表中顯示的是張三添加完的記錄,結果列出來(lái)的是李四的信息。這是神馬情況。
其原因就是static變量搞的鬼了,因為張三用戶(hù)登錄后,李四馬上登錄了,此時(shí)服務(wù)器上static變量的值被重新賦值,而不是張三的名字了,別李四給替換了。這樣,張三添加信息后,數據庫在給張三列表顯示其數據的時(shí)候。李四的信息就自然而來(lái)的顯示出來(lái)了。這看似很詭異的問(wèn)題,其實(shí)暗含著(zhù)asp.net的運行機制問(wèn)題。
asp.net中,所有用戶(hù)使用的是同一個(gè)static變量的值,這個(gè)常適用與記錄站點(diǎn)的訪(fǎng)問(wèn)歷史人數。每次多一個(gè)人訪(fǎng)問(wèn),static變量的值就加一。所有的用戶(hù)顯示的站點(diǎn)歷史人數值也跟著(zhù)變化。但是其萬(wàn)萬(wàn)不能被使用于記錄用戶(hù)登入的全局變量,不然就會(huì )出現上述的問(wèn)題。小小全局變量暗含著(zhù)潛在的數據泄露的大殺機。
那么要是想實(shí)現B/S端針對客戶(hù)端用戶(hù)的頁(yè)面級的全局變量該怎么實(shí)現呢?還好,除了傳統的Asp中的Session對象外,Asp.net提供了一個(gè)更好的ViewState對象。ViewState對象用來(lái)保存頁(yè)面中的各種變量,甚至是對象。為什么可以用ViewState而不能用static變量哪?原因就是服務(wù)器端會(huì )為每個(gè)連接到該頁(yè)面的用戶(hù)分別建立一個(gè)ViewState,所以ViewState相當于頁(yè)面級的Session。這下我們可以放心地使用ViewState來(lái)存取需要暫存的變量和對象了。不過(guò)如果要使用 ViewState,則在 ASPX 頁(yè)面中必須有一個(gè)服務(wù)器端窗體標記 (<form runat=server>)。
http://www.cnblogs.com/jianglan/archive/2012/12/06/2804974.html
http://weball.blog.sohu.com/103318100.html