通過頁面的IsPostback屬性,可以檢查 .aspx 頁是否為傳遞回服務器的頁面;當加載頁面并對控件的更改屬性處理之前,用戶可以在page_Load事件中檢查該頁面是否被傳遞回的頁面。
一般是在page_load中檢查是否是第一次加載本頁或是判斷是否是用戶提交(PostBack)
if (!IsPostBack) {
//do something
}
在用DataGrid訪問和更新數據庫時沒有注意到這個問題,會出現各種各樣的奇怪問題,比如我的這種.
問題描述:
用DataGrid訪問和更新數據庫(SQL Server --Northwind --table name:categories --Query :select categoryID,categoryName,Description form categories ),除了更新操作以外,其它功能OK.對DataGrid進行如下操作:點擊“編輯”,相應的行數據變為可編輯,同時編輯按鈕被“更新”和“取消”代替。對數據進行編輯,如把Description中的AAA改為BBB。再點“更新”按鈕。本意是想用此方法將修改后的數據(BBB)代替數據庫中原有的AAA,當然是用Update方法了。但在點“更新”后,數據沒有改變,我做過測試,UPDATE方法是有效的,也就是說,UPDATE方法更新的不是新數據,而是沒有修改前的舊數據,造成數據沒有更新(實際上是更新了)。要注意的是我的Page_Load事件如下
PRivate void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
OleAd.Fill(ds);//OleAd--oledbAdapter
dg.DataBind();//dg--DataGrid
}
分析問題(個人推測,請指正):
由于沒有用IsPostBack判斷是否是第一次加載此頁面,所以不管什么情況下只要有PostBack,都會對dg(DataGrid)進行數據綁定。所以在進行任何的sumbit后,dg都會去數據庫綁定數據而不理會頁面中的數據。
當對選中的數據進行修改完畢后,在點“更新”時,提交此頁面修改的數據,而馬上遇到Page_Load事件,不等對修改數據進行處理,服務器就先生成原頁面(MS用這種方法提高速度?),發現dg.DataBind(),執行之,于是放棄數據庫更新,于是看不到更新結果了。
解決問題:
解決倒是很簡單,Page_Load事件中加上對IsPostBack的判斷就可以了。
private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
OleAd.Fill(ds);//OleAd--oledbAdapter
if(!IsPostBack)
{
dg.DataBind();//dg--DataGrid
}
}
現在從對asp.net頁面的執行順序開始,體會一下B/S結構的程序的特點,下圖是ASP.NET頁面的執行順序說明:
Page_Init(頁面初始化引發的事件)——>Page_Load(加載頁面時引發的事件)——>Control Event(服務器控件引發的事件)——>Page_UnLoad(頁面從內存中卸載時引發的事件)
Page_Init和Page_UnLoad不常用,但是這里還是要說明一下。Page_Init和Page_Load事件區別在于,只有后者才能完全加載控件,綁定數據,雖然你可以在Page_Init中訪問控件,但是其viewstate都不會被加載,所以此時控件中只擁有默認值。
這里說到了viewstate,我們先來做一個大致的了解——其實在ASP.NET中有兩個viewstate。一個是控件本身的,用來維護控件自己的一些狀態,比如說某個空間有變色的功能,它的viewstate就維護這個功能,這個viewstate是不能被用戶訪問的。相信自己寫過控件的朋友都會有這樣的感覺,自己寫控件當然也要用自己的一個viewstate來維護這個控件的狀態;而另外一個viewstate,是用戶使用的,這個viewstate和session幾乎一模一樣,必須要先對其進行定義,才能使用。
每當點擊ASP.NET的Web網頁上的Button、LinkButton或ImageButton等控件時,表單就會被發送到服務器上。如果某些控件的AutoPostBack屬性被設置為true,那么當該控件的狀態被改變后,也會使表單會發送回服務器。?(AutoPostBack屬性,它只有兩個bool值,true/false。如果這個屬性被設置成false,那么點擊后就不會立刻將變化傳給服務器處理,也就不會有該控件的SelectedIndexChanged事件。)
每次當表單被發送回服務器,就會被重新加載,啟動Page_Load事件,執行Page_Load事件處理程序中的所有代碼(注意,是每次都會執行!)。
很顯然把網頁的初始化代碼放在這里是最合適不過。我們經常會希望在每次加載網頁時執行一些代碼,如一些控件的數據綁定。
當我們希望只有在網頁第一次加載時執行另一些代碼(基本上都是數據的默認綁定),甚至希望一些代碼在除首次加載外的每次加載時執行。那么我們可以利用IsPostBack特性來完成這一功能。在網頁第一次加載時,該屬性的值是false。如果網頁因回送而被重新加載,IsPostBack屬性的值就會被設置為true。
在ASP.NET應用程序中,如果需要在頁面第一次顯示時執行一些初始化操作,必須判斷IsPostBack屬性!
在ASP.NET使用Page.IsPostback,那么就可以避免往返行程上的額外工作:如果處理服務器控件回發,通常需要在第一次請求頁時執行代碼,該代碼不同于激發事件時用于往返行程的代碼。如果檢查?Page.IsPostBack?屬性,則代碼可按條件執行,具體取決于是否有對頁的初始請求或對服務器控件事件的響應。這樣做似乎很明顯,但實際上可以忽略此項檢查而不更改頁的行為。該屬性用的好壞,直接關系到你程序運行是否按照你最初的意愿,也關系到整個頁面的效率。因為,如果每次都會給控件綁定數據,不管你是第一次訪問,還是提交了數據以后,那么這個頁面程序的效率可想而知。
一個B/S結構的頁面每一次提交,它都會重新從頭到尾執行一次。而C/S結構的程序就不會這樣,這是和C/S結構的程序最大的區別!? 其實,得不到控件的數據,都是因為這個原因。
新聞熱點
疑難解答