ASP.NET不用於delphi等WinForm,因為傳統型程式是面向一個使用者,而ASP.NET是面向多個使用者。
所以,當你在程式中的class下,在方法、函數前寫變數是,雖然是全頁變數,但只要頁面重新整理,這個新賦值的值都會丟失。
如:
public class along:System.Web.UI.Page{ string s="a"; protected void Button1_Click(){ s+="b"; textbox1.text=s;}protected void Button2_Click(){ s+="c"; textbox1.text=s;}}
你會發現 每當你點擊按鈕的時候,s的值並沒有重複累加,而只是從初始化的a開始。
由於我們每次重新整理asp.net頁面都是一個全新的對象,而不是上一次訪問的對象。所以 上次頁面訪問時對頁面中變數的改動都沒有保留。遇到這個問題的時候直覺就將這個變數設 置成static,這樣是可以保留住頁面中變數的狀態。但這個狀態是針對一個用戶端的(如同 session的效果)。而得到的結果是只要一個用戶端改變了該值則所有的其他用戶端都受到 了影響(如同Applicatin的效果)。
究其原因這還要從Asp.net的運行機制談起。在C/S模式軟體開發過程中,我們通常不會 關心應用程式是在哪裡啟動並執行,變數存放在哪裡,用戶端程式就運行在用戶端,伺服器端程 序就運行在伺服器端,一般情況下,二者除了資料庫中的資料外基本沒有其他共用的問題。 所以這時用戶端的使用者大可放心的使用static變數,因為它們就存放在用戶端程式中。
於是我們就習慣的在做B/S模式的頁面時也用static變數,殊不知Asp.net中的static已 不同於C/S中的static。是因為在Asp.net中所有的使用者將使用同一個static變數。這就意味 著每一個使用該頁面的使用者對該變數的操作將會影響到其他使用者。
解決的辦法之一是可以選擇Asp.net提供的ViewState對象。ViewState對象可以用來保 存頁面中的各種變數,甚至是對象。“有些資料可以直接儲存到ViewState中,諸如字串 、整數、布爾、數組裡表、雜湊表等。”③只要用變數名稱做索引,如ViewState[“Var ”], 就可以存取變數Var的值,而不管Var是普通變數,還是對象,甚至是記憶體中的一張DataTabl e。伺服器端會為每個串連到該頁面的使用者分別建立一個ViewState,所以ViewState相當於 頁面級的Session。相當於頁面全域變數,但是一旦退出當前頁面,它就會丟失。
ViewState的用法很簡單,如下所示:
1、儲存變數到ViewState中:
ViewState[“times”]=times; //存放普通變數times
ViewState[“Orders”]=dtOrders; //存放DataTable型對象dtOrders
2、讀出ViewState中的值:
times=(int)ViewState[“times”];
dtOrders=(DataTable)ViewState[“Orders”];
讀出變數的值時要進行強制類型轉換,這是因為當變數(不管是int型的普通變數times ,還是DataTable型的對象dtOrders)被存放到ViewState中後統統按Object類型存放。所以 當我們從ViewState取出時,一定要轉換成相應的類型,否則就會報錯。在變數儲存到ViewS tate中時,系統會自動轉換。
這不是說static型變數就沒用了,在C#中用static聲明的類不用執行個體化直接使用。正是 由於所有使用者共用伺服器端的同一個static變數,所以可以用static型對象來存取一些公用 的處理模組,比如類型轉換、變數驗證等工作。所以要根據具體情況而定。
還有一點需要注意:如果在頁面中多個過程要共用一個對象或變數,我們在頁面類的開 始部分定義一個頁面級的全域變數是不行的,static本來可以,但上面說了這種類型的變數 不安全,所以這時就可以用ViewState。
ViewState是將資料存入到頁面隱藏控制項裡,不再佔用伺服器資源,因此, 我們可以將一 些需要伺服器"記住"的變數和對象儲存到viewstate裡面。viewstate並不能儲存所有的.net 類型資料,它僅僅支援String、Integer、Boolean、Array、ArrayList、Hashtable 以及自 定義的一些類型。
ViewState 常用於儲存單個使用者的狀態資訊,生存期等於頁面的生存期。viewstate是 在本頁面之內各函數間進行傳值的 , 至於為什麼要使用這種方法是因為在一個事件發生之 後 , 頁面可能會重新整理 , 如果定義全域變數會被清零 , 所以要使用 viewstate保持資料,任何事物都有兩面性, 因為ViewState變數在用戶端實際上是用<input type=“hidden ” value=“ADFAIB3P234P-AFAFAF……”/>儲存的一個對象,這樣如果要儲存的是個對象, 甚 至是個很複雜的對象(如DataTable),這樣以來就會增加網路傳輸的負擔。
使用viewstat e會增加頁面html的輸出量,佔用更多的頻寬,這一點是需要謹慎考慮的。另外, 由於所有的v iewstate都是儲存在一個隱藏欄位裡面,使用者可以很容易的通過查看源碼來看到這個經過base6 4編碼的值,然後再經過轉換就可以擷取你儲存其中的對象和變數值。
ViewState只能在一個頁面上傳值(session可跨多個頁面傳值),ViewState只是在當 前page內有效,關了當前頁,再重新開啟,ViewState所儲存的值也就消失了。需要在使用者 訪問一個頁面時保持一個變數的值,並隨時改變它的值,用ViewState好些。ViewState是用 來同步用戶端與服務端的變數狀態的?當有兩個使用者對同一頁面進行操作時,若使用Static? 出現了資料張冠李戴的嚴重錯誤時,改為ViewState後就會一切正常了。