一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - Asp.net中static變量和viewstate的使用方法(謹(jǐn)慎)

Asp.net中static變量和viewstate的使用方法(謹(jǐn)慎)

2019-10-17 10:41asp.net教程網(wǎng) ASP.NET教程

如在頁面中統(tǒng)計某個按鈕被按下的次數(shù),先在類中OnClick事件的處理過程前定義一static變量times,則每次調(diào)用該按鈕的OnClick事件時,令times增1即可,非常方便,接下來詳細(xì)介紹,感興趣的朋友可以了解下

在.Net平臺下進行CS軟件開發(fā)時,我們經(jīng)常遇到以后還要用到某些變量上次修改后的值,為了簡單起見,很多人都習(xí)慣用static來定義這些變量,我也是。這樣非常方便,下一次調(diào)用某個函數(shù)時該變量仍然保存的是處理過的值,直接拿來用就可以了。 

現(xiàn)在轉(zhuǎn)入了BS軟件開發(fā),我們很自然地會沿用這種習(xí)慣。如在頁面中統(tǒng)計某個按鈕被按下的次數(shù),先在類中OnClick事件的處理過程前定義一static變量times,則每次調(diào)用該按鈕的OnClick事件時,令times增1即可,非常方便: 
[C#]: 

復(fù)制代碼代碼如下:

... 
static int times=0; 
... 
private void Button1_Click(object sender,EventArgs e) 

times++; 
Label1.Text=times.ToString(); 


在我們慶幸如此方便之余,就未曾意識到我們已經(jīng)埋下了一棵難以察覺的定時炸彈。為什么哪? 
這還要從Asp.net的運行機制談起。在CS模式軟件開發(fā)過程中,我們通常不會關(guān)心應(yīng)用程序是在哪里運行的,變量存放在哪里,客戶端程序就運行在客戶端,服務(wù)器端程序就運行在服務(wù)器端,一般情況下,二者除了數(shù)據(jù)庫中的數(shù)據(jù)外基本沒有其他共享的東西。所以這時客戶端的用戶大可放心的使用static變量,因為它們就存放在客戶端程序中。 

于是我們就習(xí)慣的在做BS模式的頁面時也用static變量,殊不知Asp.net中的static已不同于CS中的static。原因很簡單,就是因為在Asp.net中所有的用戶將使用同一個static變量。這就意味著每一個使用該頁面的用戶對該變量的操作將會影響到其他用戶。就拿上面計數(shù)器的例子來說,假設(shè)times初試值為0,因為此時只有我們自己在使用這個頁面,當(dāng)然不會有什么問題,但如果有兩個人同時連接到這個頁面,如果A單擊了Button1一次,則B刷新頁面后Label1將顯示1,如果B再單擊Button1一次,則times變成2,兩個人刷新頁面后就出現(xiàn)問題了:A和B都會說,我明明只單擊了Button1一次,怎么Label1就顯示我單擊了兩次哪?——這就是因為兩個人共用的是服務(wù)器上同一個times,任何一個人對times的操作都會在使用該頁面的他人的瀏覽器中表現(xiàn)出來。問題就出在這里。 

怎么辦哪?還好,除了傳統(tǒng)的Asp中的Session對象外,Asp.net提供了一個更好的ViewState對象。ViewState對象用來保存頁面中的各種變量,甚至是對象。使用方法和HashTable類似,只要用變量名稱做索引,如ViewState["Var"],就可以用存取變量Var的值,而不管Var是普通變量,還是對象,甚至是內(nèi)存中的一張DataTable,太方便了。為什么可以用ViewState而不能用static變量哪?原因就是服務(wù)器端會為每個連接到該頁面的用戶分別建立一個ViewState,所以ViewState相當(dāng)于頁面級的Session。這下我們可以放心地使用ViewState來存取需要暫存的變量和對象了。 
ViewState的用法很簡單,如下所示: 
1、保存變量到ViewState中: 
ViewState["times"]=times;//存放普通變量times 
ViewState["Orders"]=dtOrders;//存放DataTable型對象dtOrders 
2、讀出ViewState中的值: 
times=(int)ViewState["times"]; 
dtOrders=(DataTable)ViewState["Orders"]; 
看見了吧?就如此簡單!有的朋友會問讀出變量的值時為什么要進行強制類型轉(zhuǎn)換?這是因為當(dāng)變量(不管是int型的普通變量times,還是DataTable型的對象dtOrders)被存放到ViewState中后,ViewState可不管你是普通變量還是對象,統(tǒng)統(tǒng)按Object來對待。所以當(dāng)我們?nèi)〕龃娣旁赩iewState中的東西時,一定要轉(zhuǎn)換成相應(yīng)的類型,否則就會報錯。而這一操作不用在用ViewState保存變量時進行,系統(tǒng)會自動轉(zhuǎn)換。(注意ViewState括號中的字符串只是為了標(biāo)識不同變量的索引,用不著非要和變量同名)所以上面計數(shù)器的代碼應(yīng)該這樣寫才好: 

復(fù)制代碼代碼如下:

... 
ViewState["times"]=0; 
... 
private void Button1_Click(object sender,EventArgs e) 

int times=(int)ViewState["times"]; 
times++; 
ViewState["times"]=times; 
Label1.Text=times.ToString(); 


一般情況向下,將要保存到ViewState中的對象(或變量)用屬性的形式來實現(xiàn)會更方便。如對于上述的計數(shù)器times,可以這樣處理: 

復(fù)制代碼代碼如下:

... 
private int times 

get 

return (int)ViewState["times"]; 

set 

ViewState["times"]=value; 


... 
private void Button1_Click(object sender,EventArgs e) 

times++; 
Label1.Text=times.ToString(); 

... 


在這里times將當(dāng)作私有屬性來操作,是不是非常方便? 
那是不是說static型變量就沒用了哪?當(dāng)然不是!在C#中用static聲明的類不用實例化直接使用。正是由于所有用戶共享服務(wù)器端的同一個static變量,所以可以用static型對象來存取一些公用的處理模塊,比如類型轉(zhuǎn)換、變量驗證等工作。所以要根據(jù)具體情況而定。 

還有一點需要注意:如果在頁面中多個過程要共享一個對象或變量,我們在頁面類的開始部分定義一個頁面級的全局變量是不行的,static本來可以,但上面說了這種類型的變量不安全,所以這時就可以用ViewState。 

好了,這下我們可以放心的暫存某些變量或?qū)ο罅恕?/span>

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人精品在线 | 我与岳乱短篇小说 | 精品午夜久久福利大片免费 | 婷婷日日夜夜 | 久久精品热在线观看85 | 国产精品夜夜爽张柏芝 | 国产精品视频播放 | 亚洲第一综合网 | 四虎影视4hu最新地址在线884 | 9自拍视频在线观看 | 男人的视频网站 | 免费国产影视观看网站入口 | 猛吸奶水的老汉 | 成人精品mv视频在线观看 | 美女gif跪趴式抽搐动态图 | 欧美在线欧美 | 手机跑分排行最新排名 | 国产趴着打光屁股sp抽打 | 国产精品成人 | 海角社区在线登录 | 日韩一区在线播放 | 日韩永久在线观看免费视频 | 国产一成人精品福利网站 | 色花堂国产精品首页第一页 | 皇上好大好硬好涨好深好爽 | 香蕉草莓视频 | 色哟哟哟在线精品观看视频 | 欧美在线视频 一区二区 | 久久久久免费视频 | 人人九九| 久久精品一区 | 国产一区二区精品久久91 | 特色特色大片在线 | 亚洲视频久久 | 天美传媒tm0087| 国产精品第一区揄拍 | 黄色大片网站 | 国产精品久久久久久网站 | 草草在线免费视频 | 日本妇人成熟免费不卡片 | 被强迫变性翘秘书 |