IsPostBack深入分析

2021-05-21 20:00:25 字數 4173 閱讀 6904

1、ispostback 介紹

ispostback是 page類有乙個 bool型別的屬性,用來判斷針對當前 form的請求是第一次還是非第一次請求。當 ispostback= true時表示非第一次請求,我們稱為 postback,當 ispostback= false時表示第一次請求。在 asp.net框架內部有很多的場景需要判斷 ispostback,比如 loadallstate等操作就需要在 postback的時候進行。對於我們自己使用 webform進行開發時,經常會在 page_load中對 ispostback進行判斷,因為第一次請求的時候會執行 page_load,在非第一次請求的時候也會執行 page_load。為什麼對同乙個 form有多次請求呢? asp.net中引入了伺服器端事件,支援伺服器端事件的控制項,會發出對當前 form的請求,這樣在很多情形下我們就需要區別是否是對這個 form的第一次請求。 

2、ispostback 結論 

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

結論①    對於使用 server.transfer進行遷移時遷移到的頁面其 ispostback= false。 

結論②    post方式如果 request中沒有請求值,即 request.form =null則 ispostback= false; get方式如果 request中沒有請求值,即 request.querystring =null則 ispostback= false。 

結論③    如果querystring或form雖然有請求值,但是querystring或form中的key沒有「__viewstate」和 「__eventtarget」和「__viewstatefieldcount」,並且沒有鍵為「null」,值以「__viewstate」開頭並且也沒有值為「__eventtarget」的鍵值對,則ispostback=false。 

結論④    使用 response.redirect方式向自畫面遷移時,此時 ispostback =false。 

結論⑤    發生跨頁提交( crosspagepostback),當訪問 previouspage屬性的時候,對於源 page, ispostback=true。 

結論⑥    發生跨頁提交( crosspagepostback)時目標頁面是 ispostback= false

結論⑦    使用 server.execute遷移到的頁面其 ispostback= false。 

結論⑧    在 page執行期間其對應的 dll被更新了並且 page的樹結構發生過變化,這種情況下請求時 ispostback= false。 

可以這樣來理解這些結論:一般情況判斷 request中如果沒有請求值則 ispostback= false。如果有請求值但是不包括 「__viewstate」等一些特殊的鍵或值,則 ispostback= false(每次請求後 .net框架會將一些特殊的隱藏域「 __viewstate 」等返回給客戶端)。還有一些特殊的情形是上面的規則不能正確判斷的需要特殊處理的,這些情形包括 server.transfer, response.redirect, crosspagepostback, server.execute,發生了頁面元素變化及重新編譯。 

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

3、ispostback 推論過程

下面是根據 .net框架中的源**,來分析 ispostback是如何判斷出來的。對於這些結論的推斷本人做了相關的試驗來證明推論的正確性,由於篇幅的原因沒有將這些試驗**體現出來。另外不可能將全部的 .net框架的**都體現出來,只是將相關的**片段列出,說明推斷的依據。另外由於本人水平有限對 .net框架的**理解還存在的不足的地方,請發現後進行指正,謝謝。 

public bool ispostback 

if (this ._ iscrosspagepostback )  

if (this _pageflags [8]) 

return ( 

( (this.context .serverexecutedepth <= 0 ) || 

((this.context .handler != null ) && 

(base.gettype () == this .context .handler .gettype ())) 

) && !this._ fpagelayoutchanged 

); }

} 我們將每乙個 if判斷作為乙個小節,作如下的分析。 

3.1  this._requestvaluecollection == null

if (this._requestvaluecollection == null ) 

可以看出 _requestvaluecollection等於 null時 ispostback就等於 false。 

在 page.processrequestmain(bool , bool ) 中有如下的**: 

if (this .pageadapter != null ) 

else 

pageadapter.determinepostbackmode 最終還是呼叫了 page.determinepostbackmode ,下面我們看 page.determinepostbackmode 如何實現。 

}  這個函式中返回 null就意味者 ispostback= false,將上面函式中每個返回為 null的地方作如下的分析。 

3.1.1  this.context.request == null 

if (this

. context.request

== null)

this.context.request == null 應該只有在異常的情況下會發生,正常情況下會在 httpruntime.processrequestinternal 中建立 httpcontext及 httprequest物件。 

3.1.2 this.context.preventpostback

if (this

. context

.preventpostback)    在 httpserverutility.transfer 中會使用 preventpostback ,其**如下: 

public void transfer(string path) 

在呼叫 server.transfer進行畫面遷移時設定 context.preventpostback = ture。此處得出結論①:對於使用 server.transfer進行遷移時遷移到的頁面其 ispostback= false。

深入分析ConcurrentHashMap

再多執行緒的情況下,如果使用hashmap,就會導致死迴圈,導致cpu利用率接近100 所以如果是併發的情況不要使用hashmap 導致死迴圈主要是這段 當在多執行緒的情況由於沒有同步導致,著段 在擴容的時候會執行 do while e null 執行緒安全的hashtable 容器 hashtab...

深入分析malloc

本文大量參考了如何實現乙個malloc這篇文章。任何乙個用過或學過c的人對malloc都不會陌生。大家都知道malloc可以分配一段連續的記憶體空間,並且在不再使用時可以通過free釋放掉。但是,許多程式設計師對malloc背後的事情並不熟悉,許多人甚至把malloc當做作業系統所提供的系統呼叫或c...

深入分析ConcurrentHashMap

執行緒不安全的hashmap 因為多執行緒環境下,使用hashmap進行put操作會引起死迴圈,導致cpu利用率接近100 所以在併發情況下不能使用hashmap。效率低下的hashtable容器 hashtable容器在競爭激烈的併發環境下表現出效率低下的原因,是因為所有訪問hashtable的執...