您所在的位置: 首页 >> 推荐文章 >> 正文

PostBackUrl 事件分析
发表日期:2013年4月5日   作者:識丁筆記   点击:

當頁面上的 Button 或 LinkButton 用到 PostBackUrl 屬性時,使用者按下 Button 網頁會直接轉到 PostBackUrl 所指定的網頁(以下稱為 target page)。這個動作有如 <a> 一般。

如果 target page 沒有用到 Page.PreviousPage 的屬性,結果就跟 <a> 完全一樣了。

當 target page 第一次用到 Page.PreviousPage 的時候,source page 會被 "load" 到程式中。這個 "load" 的動作,會觸動 soruce page 的 Page.Load 事件。既使在 target page 裡,多次使用 Page.PreviousPage屬性,這個 "load" 動作只會被執行一次。

這個事實,有兩種意義:

  1. Source page 有機會在 Page.Load 事件裡將網頁上的資料準備好。通常網頁上的資料會存放在程式自訂的屬性裡。
  2. Page.Load 事件被觸動,可能造成未預期的影響。每個網頁的設計不同,要謹慎處理。例如,有些程式會在 Page.Load 讀、寫資料庫的內容。

這裡要注意,source page 再度被 "load",其 IsPostBack 屬性會是 True。所有網頁上的資料都仍存在。如果,在 source page 的 Page.Load 事件裡,將控制項的內容更改了,target page 會取得被更改之後的內容。

重要觀念

如果 source page 上的 Button 除了 PostBackUrl 屬性,也定義了 OnClick 事件處理,當 target page 用到 Page.PreviousPage 屬性時,OnClick 事件仍然會正常處理。事件的發生順序如下:

  1. 顯示 source page。
  2. 使用者按下 Button。
  3. Server 載入 target page。
  4. taget page 第一次用到 Page.PreviousPage
  5. source page 執行 Page.Load 事件處理。
  6. source page 執行 Button.OnClick 事件處理。
  7. target page 繼續執行。
  8. 顯示 target page。

中斷 PostBackUrl

由上面的分析可知,一旦 Button 被 Click,在 Server 的程式碼已經沒有機會再阻止或更改 target page 的顯示了。在 source page 的 client script 或許可以更動這個行為。

當然 Response.Redirect() 方法還是可以使用的。不過,Server.Transfer()好像有些問題。沒有進一步瞭解之前,不要輕易使用。Response.Redirect() 方法可以在 source page 或 target page 來執行。不過,既然用了 PostBackUrl,重要的處理流程應該交由 taget page 決定。

如果程式的流程需要依靠 source page 上的資料決定,比較容易的方法還是交給 taget page 的 Page.Load 事件處理來決定。這是比較標準又容易懂的方法。