ASP.NET變量的作用域


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後就會一切正常了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章