日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IsPostBack须要注意的地方,这些都不是POSTBACK动作

發(fā)布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IsPostBack须要注意的地方,这些都不是POSTBACK动作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

page.IsPostBack屬性

簡要概述:

IsPostBack

字面意思理解為:'是回滾',那如果不是回滾,那就是首次加載!

(!page.ispostback)理解為:不是回滾,值為:true.

if(!page.ispostback) //首次加載
{
//如果是第一次加載,就執(zhí)行此內(nèi)容.
}

else{非首次加載頁面}

?

?

1?????????IsPostBack介紹

IsPostBack是Page類有一個bool類型的屬性,用來判斷針對當前Form的請求是第一次還是非第一次請求。當IsPostBack=true時表示非第一次請求,我們稱為PostBack,當IsPostBack=false時表示第一次請求。在asp.net框架內(nèi)部有很多的場景需要判斷IsPostBack,比如LoadAllState等操作就需要在PostBack的時候進行。對于我們自己使用WebForm進行開發(fā)時,經(jīng)常會在Page_Load中對IsPostBack進行判斷,因為第一次請求的時候會執(zhí)行Page_Load,在非第一次請求的時候也會執(zhí)行Page_Load。為什么對同一個Form有多次請求呢?asp.net中引入了服務器端事件,支持服務器端事件的控件,會發(fā)出對當前Form的請求,這樣在很多情形下我們就需要區(qū)別是否是對這個Form的第一次請求。

2?????????IsPostBack結(jié)論

?

結(jié)論①????對于使用Server.Transfer進行遷移時遷移到的頁面其IsPostBack=false。

結(jié)論②????Post方式如果Request中沒有請求值,即Request.Form =null則IsPostBack=false;Get方式如果Request中沒有請求值,即Request.QueryString =null則IsPostBack=false。

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

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

結(jié)論⑤????發(fā)生跨頁提交(CrossPagePostBack),當訪問PreviousPage屬性的時候,對于源Page,IsPostBack=true。

結(jié)論⑥????發(fā)生跨頁提交(CrossPagePostBack)時目標頁面是IsPostBack=false

結(jié)論⑦????使用Server.Execute遷移到的頁面其IsPostBack=false。

結(jié)論⑧????在Page運行期間其對應的DLL被更新了并且Page的樹結(jié)構(gòu)發(fā)生過變化,這種情況下請求時IsPostBack=false。

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

Page_Init和Page_UnLoad

Page_Init和Page_UnLoad不常用,但是這里還是要說明一下。Page_Init和Page_Load事 件區(qū)別在于,只有后者才能完全加載控件,綁定數(shù)據(jù),雖然你可以在Page_Init中訪問控件,但是其viewstate都不會被加載,所以此時控件中只 擁有默認值。


這里說到了viewstate,我們先來做一個大致的了解——其實在ASP.NET中有兩個viewstate。一個是控件本身 的,用來維護控件自己的一些狀態(tài),比如說某個空間有變色的功能,它的viewstate就維護這個功能,這個viewstate是不能被用戶訪問的。相信 自己寫過控件的朋友都會有這樣的感覺,自己寫控件當然也要用自己的一個viewstate來維護這個控件的狀態(tài);而另外一個viewstate,是用戶使 用的,這個viewstate和Session幾乎一模一樣,必須要先對其進行定義,才能使用。

每當點擊ASP.NET的Web網(wǎng)頁 上的Button、LinkButton或ImageButton等控件時,表單就會被發(fā)送到服務器上。如果某些控件的AutoPostBack屬性被設 置為true,那么當該控件的狀態(tài)被改變后,也會使表單會發(fā)送回服務器。?(AutoPostBack屬性,它只有兩個bool值, true/false。如果這個屬性被設置成false,那么點擊后就不會立刻將變化傳給服務器處理,也就不會有該控件的 SelectedIndexChanged事件。)
每次當表單被發(fā)送回服務器,就會被重新加載,啟動Page_Load事件,執(zhí)行Page_Load事件處理程序中的所有代碼(注意,是每次都會執(zhí)行!)。
很顯然把網(wǎng)頁的初始化代碼放在這里是最合適不過。我們經(jīng)常會希望在每次加載網(wǎng)頁時執(zhí)行一些代碼,如一些控件的數(shù)據(jù)綁定。
當我們希望只有在網(wǎng)頁第一次加載時執(zhí)行另一些代碼(基本上都是數(shù)據(jù)的默認綁定),甚至希望一些代碼在除首次加載外的每次加載時執(zhí)行。那么我們可以利用 IsPostBack特性來完成這一功能。在網(wǎng)頁第一次加載時,該屬性的值是false。如果網(wǎng)頁因回送而被重新加載,IsPostBack屬性的值就會 被設置為true。

在ASP.NET應用程序中,如果需要在頁面第一次顯示時執(zhí)行一些初始化操作,必須判斷IsPostBack屬性!

在ASP.NET使用Page.IsPostback,那么就可以避免往返行程上的額外工作:如果處理服務器控件回發(fā),通常需要在第一次請求頁時執(zhí)行代 碼,該代碼不同于激發(fā)事件時用于往返行程的代碼。如果檢查?Page.IsPostBack?屬性,則代碼可按條件執(zhí)行,具體取決于是否有對頁的初始請求 或?qū)Ψ掌骺丶录捻憫_@樣做似乎很明顯,但實際上可以忽略此項檢查而不更改頁的行為。該屬性用的好壞,直接關系到你程序運行是否按照你最初的意愿, 也關系到整個頁面的效率。因為,如果每次都會給控件綁定數(shù)據(jù),不管你是第一次訪問,還是提交了數(shù)據(jù)以后,那么這個頁面程序的效率可想而知。

一個B/S結(jié)構(gòu)的頁面每一次提交,它都會重新從頭到尾執(zhí)行一次。而C/S結(jié)構(gòu)的程序就不會這樣,這是和C/S結(jié)構(gòu)的程序最大的區(qū)別!? 其實,得不到控件的數(shù)據(jù),都是因為這個原因。

總結(jié)

以上是生活随笔為你收集整理的IsPostBack须要注意的地方,这些都不是POSTBACK动作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。