關於Asp.net中static與ViewState使用的探討

來源:互聯網
上載者:User
關於Asp.net中static與ViewState使用的探討
 
  摘 要: 利用asp.net 開發基於B/S模式的應用系統,經常會遇到同一頁面類的各函數 成員之間、同一會話各頁面之間、不同機器各使用者頁面之間的傳值問題,即要解決資料共用 的問題。這可以選擇使用Application、Session、cookie、Static、ViewState等方法實現 。其中Static變數的使用容易出現問題,使用不好會導致資料紊亂,給系統造成故障隱患。 用ViewState作為頁內資料傳值也是一種較好的選擇 。根據開發設計實踐特對此問題進行了 總結探討。
  關鍵詞:asp.net;編程;應用研究;對象。
  中圖分類號:TP311.1 文獻標識碼:A 文章編號:1008-7508( 2010)09-0077-02
  利用asp.net 開發基於B/S模式的應用系統,經常會遇到同一頁面類的各函數成員之間、 同一會話各頁面之間、不同機器各使用者頁面之間的傳值問題,即要解決資料共用的問題。這 可以選擇使用Application、Session、cookie、Static、ViewState等方法實現。其中Stati c變數的使用容易出現問題,使用不好會導致資料紊亂,給系統造成故障隱患。用ViewState 作為頁內資料傳值也是一種較好的選擇 。根據開發設計實踐特對此問題進行了總結探討。
  在C#中,“當用static修飾符定義成員時,得到靜態成員,靜態成員屬於類,為這個類 的所有執行個體所共用”①。也就是該類的所有執行個體共用一個static變數。asp.net頁面就是 一 個類,每訪問一個頁面就會在伺服器上執行個體化一個該類的執行個體,來響應使用者的請求。所有實 例共用一個static變數, 這就意味著,所有的用戶端訪問到的asp.net頁面中static變數都 是同一個變數。
  “所謂ViewState,實際上是一些索引值對,ASP.NET通過它維護網頁和伺服器的狀態,並 將ViewState封裝成一個或幾個隱藏的表單域傳遞到用戶端。而用戶端提交時,ViewState也 將被提交到伺服器端。這樣後續的請求可以獲得上一次請求的狀態。”②
  由於我們每次重新整理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後就會一切正常了。
  開發C/S模式的系統和開發B/S模式的系統有很大的不同。因此我們一定要根據不同情況 正確理解各種變數的範圍和生存期,以便能夠正確使用各種儲存資料的方法而不至於出現 錯誤。

注釋:
①②陳志泊,ASP.Net資料庫應用程式開發[M].人民郵電出版社.2005.
③徐新華,精通ASP.Net2.0[M].機械工業出版社.2006.
參考文獻:
[1]劉培義,ASP.Net程式設計教程[M].清華大學出版社.2009.
[2]董義革,ASP.Net程式設計基礎與應用[M].科海出版社新址.2006.

收稿日期:2010-09-06
作者簡介: 楊敏(1963~),女,吉林市人,長春汽車工業高等專科學校副教授,主要從事自 動化控制技術的教學和研究。劉丹潔(1964~),女,吉林長春人,女,長春汽車工業高等專 科學校副教授。主要從事自動化控制技術的教學和研究。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.