Hopes

          Start Here..

           

          ASP.NET中PostBack和ViewState

          ASP.NET中PostBack和ViewState

          ASP.NET中PostBack和ViewState

          關(guān)于PostBack,我曾經(jīng)也寫過一篇博客《深入理解doPostBack》。在這篇文章里有對PostBack進(jìn)行了一些研究,現(xiàn)在看來研究的還是不夠深入。不過從原理上來說,ASP.NET WebForm中的一般WEB控件(為什么是一般呢?因為如Button等少數(shù)控件不是調(diào)用doPostBack方法的)在向服務(wù)器回發(fā)請求時,調(diào)用的就是doPostBack方法,通過表單提交的方式來向服務(wù)器提交請求。而WebForm所提供的WEB事件模型也是以doPostBack這個方法為基礎(chǔ)的,往服務(wù)器傳送的兩個隱含變量(EVENTTARGET,EVENTARGUMENT)就是PostBack事件分發(fā)的根據(jù)。EVENTTARGET保存著向服務(wù)器發(fā)出PostBack請求的控件ID,ASP.NET根據(jù)這個ID就可以找到它所對象的服務(wù)器端控件的實例。EVENTARGUMENT保存的是當(dāng)前PostBack的一些參數(shù)。除此之外,PostBack還需要什么條件呢?

          在前段時間關(guān)于WebForm和MVC的討論中,有人提到禁用了ViewState,也就無法使用了PostBack。這也給我提了一個醒,確實ViewState與PostBack有非常緊密的關(guān)系,在大多數(shù)情況下,如果控件的狀態(tài)是動態(tài)維護(hù)的。比如說DropDownList的Items是通過下面的代碼添加的:

          1. protectedvoidPage_Load(objectsender,EventArgse)  
          2. {  
          3. if(!this.IsPostBack)  
          4. {  
          5. DropDownList1.Items.Add(newListItem("1","Value1"));  
          6. DropDownList1.Items.Add(newListItem("2","Value2"));  
          7. }  

          而不是在HTML頁面上靜態(tài)添加(或是在OnInit事件之前添加,不能加IsPostBack的判斷),這時,如果禁用ViewState,那么DropDownList的SelectedIndexChanged事件將不會被正常觸發(fā),并且DropDownList的Item項將會被清空。所以從這個角度來說,如果要使用PostBack,那么ViewState勢必不能被禁用。

          除此之外,PostBack還有一些不足:

          1)頁面在PostBack后,刷新頁面時會出現(xiàn)非常不好的用戶體驗。

          2)搜索引擎的不友好。

          3)在編寫服務(wù)器端代碼時要特別的小心,特別是對IsPostBack的判斷。

          盡管PostBack在WebForm的事件機(jī)制占有舉足輕重的地位,它出現(xiàn)極大的方便了我們以事件驅(qū)動方式來開發(fā)WEB應(yīng)用。從短期的入門應(yīng)用中確實有它重要的意義。但從現(xiàn)實出發(fā),還是必須得根據(jù)不同的應(yīng)用場合有先擇性的使用。在網(wǎng)站前臺型應(yīng)用中,應(yīng)該消滅一切可以消滅的PostBack。因為做為前臺,它的作用就是展示還有查詢。而如果對查詢,分頁等操作使用PostBack的話,一方面搜索引擎的不友好,另一方面給大多數(shù)用戶帶來非常不好的用戶體驗,增加了整個頁面的請求時間。同時,它們所傳的參數(shù)又非常有限,這情況下就需要使用鏈接的方式來傳參。

          對于應(yīng)用型的后臺開發(fā),由于在提交數(shù)據(jù)時可能會有比較多的表單數(shù)據(jù)。這時,這時結(jié)合DetailView或FormView,使用PostBack來提交數(shù)據(jù)又可以給我們帶來非常大的方便,這種情況下我們不禁用ViewState也沒有關(guān)系,ViewState并不會很大,而至于刷新的問題,我們可以使用UpdatePanel來幫助解決。但是如果對于瀏覽數(shù)據(jù)仍然是要特別注意,特別是有GridView的頁面進(jìn)行PostBack數(shù)據(jù)查詢,分頁時,盡量都能改成鏈接的方式來實現(xiàn)。

          總體來說,PostBack的使用還是要特別注意,能少用就少用,但有時用它確實也會給我們帶來非常大的方便。對于應(yīng)用型的后臺開發(fā),如果使用EXT的話,那么就是可以完全摒棄WebForm,或MVC了。因為它有自己一整套完整的開發(fā)流程,從目前來看,確實是一種全新的體驗。

          連續(xù)兩篇討論的PostBack和ViewState,可能結(jié)論都是偏向消極的。它們的存在有其重要意義的同時,難免會帶來一些負(fù)面影響,但這種影響的代價在很多情況下過大而導(dǎo)致大多數(shù)人的反唇相譏。在軟件工程中,衡量軟件的標(biāo)準(zhǔn)不是越快越好,而是在用戶接受的合理的時間范疇內(nèi),得到正確的結(jié)果,并且它所花費的代價(包括開發(fā),維護(hù),部署等成本)是最少的。我相信只要使用得當(dāng),它們還是可以充分發(fā)揮它們的作用的。

          從極端的來說,去掉PostBack和ViewState后,WebForm仍然還是WebForm。它只是少了兩樣兩把利弊同樣明顯的雙刃劍,它余下的事件機(jī)制,組件化開發(fā),頁面模型仍然是我們進(jìn)行WebForm開發(fā)最有力的武器

          posted on 2012-10-27 21:55 ** 閱讀(210) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          收藏夾

          C#學(xué)習(xí)

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 大同市| 神池县| 黄梅县| 建宁县| 康保县| 天津市| 始兴县| 金阳县| 邳州市| 诸城市| 和平区| 武邑县| 侯马市| 基隆市| 通辽市| 阿坝| 淳化县| 达孜县| 玛曲县| 云林县| 申扎县| 保靖县| 嘉定区| 车险| 拉萨市| 招远市| 民丰县| 普宁市| 襄城县| 英超| 雷山县| 房产| 含山县| 小金县| 区。| 修武县| 南丹县| 自贡市| 辛集市| 社会| 玉树县|