IsPostBack (1)

今天這個問題困擾了我好久,

不知道誰寫的破項目,到處都是bug,好多類封裝了,也不寫個註釋,命名還不怎麼規範,我又不是神仙。

抱怨結束....今天研究了一下IspostBack到底咋回事

我用最白的語言說,IsPostBack,是否第二次回來,默認的IspostBack爲true,一般我們在寫程序裏面load裏都會加上

if(!IsPostBack)//說明第一加載頁面時候,進來,第二次就不執行裏面的方法了。

找了一些資料,供自己看:

1         IsPostBack介紹

IsPostBackPage類有一個bool類型的屬性,用來判斷針對當前Form的請求是第一次還是非第一次請求。當IsPostBacktrue時表示非第一次請求,我們稱爲PostBack,當IsPostBackfalse時表示第一次請求。在asp.net框架內部有很多的場景需要判斷IsPostBack,比如LoadAllState等操作就需要在PostBack的時候進行。對於我們自己使用WebForm進行開發時,經常會在Page_Load中對IsPostBack進行判斷,因爲第一次請求的時候會執行Page_Load,在非第一次請求的時候也會執行Page_Load。爲什麼對同一個Form有多次請求呢?asp.net中引入了服務器端事件,支持服務器端事件的控件,會發出對當前Form的請求,這樣在很多情形下我們就需要區別是否是對這個Form的第一次請求。

2         IsPostBack結論

本人對.Net的源代碼中相關的處理進行的分析得到如下的結論:

結論①    對於使用Server.Transfer進行遷移時遷移到的頁面其IsPostBackfalse

結論②    Post方式如果Request中沒有請求值,即Request.Form =nullIsPostBackfalseGet方式如果Request中沒有請求值,即Request.QueryString =nullIsPostBackfalse

結論③    如果QueryString或Form雖然有請求值,但是QueryString或Form中的Key沒有“__VIEWSTATE”和“__EVENTTARGET”和“__VIEWSTATEFIELDCOUNT”,並且沒有鍵爲“null”,值以“__VIEWSTATE”開頭並且也沒有值爲“__EVENTTARGET”的鍵值對,則IsPostBack=false。

結論④    使用Response.Redirect方式向自畫面遷移時,此時IsPostBack=false。

結論⑤    發生跨頁提交(CrossPagePostBack),當訪問PreviousPage屬性的時候,對於源PageIsPostBack=true

結論⑥    發生跨頁提交(CrossPagePostBack)時目標頁面是IsPostBackfalse

結論⑦    使用Server.Execute遷移到的頁面其IsPostBackfalse

結論⑧    Page運行期間其對應的DLL被更新了並且Page的樹結構發生過變化,這種情況下請求時IsPostBackfalse

可以這樣來理解這些結論:一般情況判斷Request中如果沒有請求值則IsPostBackfalse。如果有請求值但是不包括“__VIEWSTATE”等一些特殊的鍵或值,則IsPostBackfalse(每次請求後.Net框架會將一些特殊的隱藏域“__VIEWSTATE”等返回給客戶端)。還有一些特殊的情形是上面的規則不能正確判斷的需要特殊處理的,這些情形包括Server.TransferResponse.RedirectCrossPagePostBackServer.Execute,發生了頁面元素變化及重新編譯。

一般來說記住上面的結論就可以,如果您有興趣,或者懷疑請繼續看下面的IsPostBack推論過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章