ASP 是一項微軟公司的技術,是一種使嵌入網頁中的指令碼可由網際網路伺服器執行的伺服器端指令碼技術指
Active Server Pages(動態伺服器頁面),運行於 IIS 之中的程式 。
在學習ASP.NET視頻中,先瞭解剛開始最先接觸的就是表單載入事件,當我們第一次瀏覽器請求伺服器時會會執行Page_Load,在非第一次請求的時候也會執行Page_Load。為什麼對同一個Form有多次請求呢?asp.net中引入了伺服器端事件,支援伺服器端事件的控制項,會發出對當前Form的請求,這樣在很多情形下我們就需要區別是否是對這個Form的第一次請求。解決這個問題我們引入了PostBack的IsPostBack屬性:
在深究該屬性之前我們先區分PostBack的IsPostBack的區別:由aspx的頁面回傳機制的基礎知識得知 postback是回傳即頁面在首次載入後向伺服器提交資料,然後伺服器把處理好的資料傳遞到用戶端並顯示出來,就叫postback,
ispostback只是一個屬性,即判斷頁面是否是回傳,if(!Ispostback)就表示頁面是首次載入,這是很常用的一個判斷方式.一個頁面只能載入一次,但可以在載入後反覆postback
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的第一次請求
代碼解析:
1、對於使用Server.Transfer進行進行遷移時遷移到的頁面其IsPostBack=false 每次重新整理頁面都是第一次載入頁面;
2. Post方式如果Request中沒有請求值,即Request.Form =null則IsPostBack=false;Get方式如果Request中沒有請求值,即Request.QueryString =null則IsPostBack=false。
namespace Example{ public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) //不是回傳即第一次載入頁面傳過來的值為空白 { if (Request.QueryString["id"] != null) { Response.Write("回傳"); } else { Response.Write("不是回傳"); } } } protected void button1_Click(object sender, EventArgs e) { Response.Redirect("WebForm1.aspx?id=3 "); } }}
3.使用Response.Redirect方式向自畫面遷移時,此時IsPostBack=false
4.發生跨頁提交(CrossPagePostBack),當訪問PreviousPage屬性的時候,對於源Page,IsPostBack=true。發生跨頁提交(CrossPagePostBack)時目標頁面是IsPostBack=false。
5.使用Server.Execute遷移到的頁面其IsPostBack=false。
Server.Execute和Server.Transfer的區別
Server.Execute("another.aspx")和Server.Transfer("another.aspx")區別:
Execute是從當前頁面轉移到指定頁面,並將執行返回到當前頁面
Transfer是將執行完全轉移到指定頁面
執行個體1:
protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { SqlConnection con = DB.createConnection(); con.Open(); SqlCommand cmd = new SqlCommand("select * from personLike", con); SqlDataReader sdr = cmd.ExecuteReader(); this.CheckBoxList1.DataTextField = "likeContent"; this.CheckBoxList1.DataValueField = "id"; this.CheckBoxList1.DataSource = sdr;
假設在page_load()裡定義textbox為空白,在button_click事件裡給寫一段往資料庫存textbox的值.當使用者往 textbox裡輸入值以後,點擊button時,就應該可以把往textbox裡輸入的值存到資料庫裡.可實際上,當點擊button的時候,系統會自動先重新執行page_load(),也就是把柄textbox清空,再執行click 事件,你往資料庫裡存的值永遠都是空.所以要在page_Load() 裡加入if(!IsPostBack).
二、解決編輯資料時資料更新的資料原來的,無法修改的問題
解析:因為當後台編輯資料時,先從後台查詢出需要編輯的資料,此時是在不是回傳的情況下從資料庫查詢出資料,當編輯完資料之後,點擊提交按鈕,提交資料,此時如果沒有判斷是否回傳,會重新查詢原來的資料,造成編輯資料沒有改變。
namespace Example{ public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) //不是回傳即第一次載入頁面傳過來的值為空白 { } if (Request.QueryString["id"] != null) { Bind(); } else { Response.Write("<script>alert('資料發生改變')</script>"); } } public void Bind() { Response.Write("資料"); } protected void button1_Click(object sender, EventArgs e) { Response.Redirect("WebForm1.aspx?id=3 "); //Server.Execute("WebForm2.aspx?id=3"); } protected void CesH_Click(object sender, EventArgs e) { Label1.Text = "測試"; } }}
IsPostBack結論學習總結
① 對於使用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,發生了頁面元素變化及重新編譯。