Download presentation
Presentation is loading. Please wait.
1
第 11 章 ASP.NET 網頁的執行方式
2
ASP.NET 的生命週期 讓我們再次回味一下,之前 Web Form 的範例 01: 02: 03: Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) 04: LBUserName.Text = " 您輸入的姓名為「 " & TBUserName.Text.Trim() & " 」 " 05: End Sub 06: 07: 08: 09: 10: 姓名: 11: 12: 13: 14: 15:
3
ASP.NET 的生命週期 讓我們仔細檢查執行程式後的網頁原始碼。(注意:執行的過程 URL 都 一樣) POSTBACK: 使用者在這個網頁 click 的時候,資料再次回傳給 net1.aspx , 這個動作稱之為 postback 。 姓名:
4
ASP.NET 網頁的生命週期 設計的動機 每個網頁的執行都是獨立的,完成後就 跟 server 失去連結( disconnected ) 造成了所謂的 stateless 解決方案 多網頁的呼叫以及傳遞 單網頁的 POSTBACK ( ASP.NET or Servlet/JSP )
5
ASP.NET 網頁的生命週期 生命週期的階段 網頁要求 (page request) 每當使用者要求一個 ASP.NET 網頁, 一個 Page 的物件就會產生. 啟動 (start) 初始化 (initialization) 載入 (load) 驗證 (validation) 事件處理 (event handling) 顯示 (rendering) 卸載 (unload) 完成要求之後, Page 物件就被釋放。
6
保留 Page 的狀態 ASP.NET helps preserve other page information in the following ways: ASP.NET saves control settings (properties) between round trips, which is called saving control state. ASP.NET provides state management capabilities so you can save your own variables and application-specific or session- specific information between round trips. ASP.NET can detect when a page is requested for the first time and when the page is posted, which allows you to program accordingly. For instance, you might want to read information from a database the first time a page is displayed, but not on every postback.
7
1. 初始化階段會依序觸發 Page 物件的 PreInit 、 Init 、 InitComplete 事件 2. 載入階段會依序觸發 Page 物件的 PreLoad 、 Load 、 LoadComplete 事件 3. 事件處理階段會觸發控制項的事件 ( 如果 有指定的話 ) 4. 顯示階段會依序觸發 Page 物件的 PreRender 、 PreRenderComplete 事件 5. 卸載階段會觸發 Page 物件的 Unload 事件
8
Page 物件的各個事件都有對應的事件程序,預設 的名稱為 Page_event ,例如 Load 事件的事件程序 為 Page_Load() ,其形式如下: Sub Page_Load(ByVal sender as Object, ByVal e as System.EventArgs) … End Sub
9
11-1 Page 類別 single-file 模式 Sysyem.Web.UI.Page 類 別 MyPage.aspx 檔案 ASP.MyPage_aspx 類別 組件 (assembly) 產生物件並顯示執行結果
10
code-behind 模式 Sysyem.Web.UI.Page 類別 MyPage.aspx 檔案 MyPage Partial 類別 組件 (assembly) 產生物件並顯示執行結果 MyPage.aspx.vb 檔案 MyPage_aspx 類別
11
11-1-1 Page 類別的屬性 Application Cache ClientTarget="…" ClientScript ※ EnableTheming={True|False} ※ EnableViewState={True|False} ErrorPage="URL" 。 Form
12
IsCrossPagePostBack ※ IsPostBack IsValid ※ MasterPageFile="…" ※ MaxPageStateFieldLength="…" ※ PreviousPage ※ Request Response Server Session SmartNavigation={True|False} ※ StyleSheetTheme="…" ※ Theme="…" ※. Trace
13
11-1-2 Page 類別的方法 Control.DataBind() Control.Dispose() Page.FindControl(id) Control.Focus() ※ Control.HasControls() Page.MapPath(path) TemplateControl.ParseControl(str) Dim MyText As TextBox MyText = CType(ParseControl(" "), TextBox) Control.ResolveUrl(url) Page.SetFocus(control) 、 Page.SetFocus(id) Page.Validate()
14
Page.ClientScript.RegisterHiddenField(name, value) ※ Page.ClientScript.RegisterClientScriptBlock(type, key, script) ※ Page.ClientScript.RegisterClientScriptInclude(key, url) ※ Page.ClientScript.RegisterStartupScript(type, key, script) ※ Page.ClientScript.RegisterOnSubmitStatement(type, key, script) ※ Page.ClientScript.IsClientScriptBlockRegistered(key) ※ Page.ClientScript.IsClientScriptIncludeRegistered(key) ※ Page.ClientScript.IsStartupScriptRegistered(key) ※ Page.ClientScript.IsOnSubmitStatementRegistered(key)
15
\Ch11\MapPath.aspx Sub Page_Load(ByVal sender as Object, ByVal e as System.EventArgs) Response.Write(" 父目錄為 " & Page.MapPath("../") & " ") Response.Write(" 目前目錄為 " & Page.MapPath("./") & " ") Response.Write(" 根目錄為 " & Page.MapPath("/") & " ") Response.Write(" 網頁實際路徑為 " & Page.MapPath("MapPath.aspx")) End Sub
16
11-1-3 Page 類別的事件 AbortTransaction CommitTransaction DataBinding Disposed Error SaveStateComplete ※ PreInit ※ Init : InitComplete ※ PreLoad ※ Load LoadComplete ※ PreRender PreRenderComplete ※ Unload
17
\Ch11\Page_Init.aspx 01: 02: 03: Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) 04: SelectList.Items.Add(" 二二八公園 ") 05: SelectList.Items.Add(" 外雙溪 ") 06: SelectList.Items.Add(" 青年公園 ") 07: End Sub 08: 09: Sub AddDest(ByVal sender As Object, ByVal e As System.EventArgs) 10: SelectList.Items.Add(Destination.Text) 11: End Sub 12: 13: 14: 15: 16: 旅遊地點: 17: 增加旅遊地點: 18: 19: 20: 21: 22:
19
11-3 PostBack 下面是一個例子:
20
\Ch11\PostBack.aspx 01: 02: 03: Sub Page_Load(ByVal sender as Object, ByVal e as System.EventArgs) 04: If Not Page.IsPostBack Then 05: InputPanel.Visible = True 06: ResultPanel.Visible = False 07: Else 08: InputPanel.Visible = False 09: ResultPanel.Visible = True 10: End If 11: End Sub 12: 13: Sub Button_Click(ByVal sender as Object, ByVal e as System.EventArgs) 14: ShowCash.Text = Cash.Text 15: ShowRate.Text = Rate.Text 16: ShowTotal.Text = Cash.Text + Cash.Text * Rate.Text 17: End Sub 18:
21
19: 20: 21: 22: 23: 請輸入本金 ( 例如 500000) : 24: 請輸入年利率 ( 例如 0.05) : 25: 26: 27: 28: 當本金為 、 29: 年利率為 時, 30: 一年的本利和為 。 31: 32: 33: 34:
22
11-4 將網頁導向到其它網頁 11-4-1 Cross-Page Posting 下面是一個例子:
23
\Ch11\Cross1.aspx 01: 02: 03: 04: 請輸入本金 ( 例如 500000) : 05: 請輸入年利率 ( 例如 0.05) : 06: 07: 08: 09:
24
\Ch11\Cross2.aspx 01: 02: 03: Sub Page_Load(ByVal sender as Object, ByVal e as System.EventArgs) 04: Dim TB1 As TextBox = CType(PreviousPage.FindControl("Cash"), TextBox) 05: Dim TB2 As TextBox = CType(PreviousPage.FindControl("Rate"), TextBox) 06: ShowCash.Text = TB1.Text 07: ShowRate.Text = TB2.Text 08: ShowTotal.Text = TB1.Text + TB1.Text * TB2.Text 09: End Sub 10: 11: 12: 13: 14: 當本金為 、 15: 年利率為 時, 16: 一年的本利和為 。 17: 18: 19:
25
課本 11-25 頁的 if 錯誤 If Page.IsCrossPagePostBack then … Else Response.Redirect(“Cross1.aspx”) End if 不能使用 Page.IsCrossPagePostBack 要使用 Page.PreviousPage.IsValid 且 / 或 PreviousPage. IsCrossPagePostBack 主要的目的在於檢查使用者不是直接執行 Cross2.aspx 這個網頁。
26
11-4-2 呼叫 Response.Redirect() 方 法導向到其它網頁 使用 HTML 語法的 標籤,可以寫成如下: 或者可以呼叫 Response.Redirect() 方法,其語法如下: Redirect(url) Redirect(url, endResponse) endResponse 是 boolean 值,代表目前的這個網頁是否結束。若只 呼叫 Redirect(url) ,預設行為是 true 。
27
11-4-2 Redirect 下面是一個例子 : \Ch11\Page1.aspx Sub Page_Load(ByVal sender as Object, ByVal e as System.EventArgs) Dim WeekDay As Integer Dim PageName As String WeekDay = DateTime.Today.DayOfWeek() ' 取得今天是星期幾 Select Case WeekDay ' 根據星期幾決定要顯示的網頁名稱 Case "0" PageName = "Sun.htm" Case "1" PageName = "Mon.htm" Case "2" PageName = "Tue.htm" Case "3" PageName = "Wed.htm" Case "4" PageName = "Thu.htm" Case "5" PageName = "Fri.htm" Case "6" PageName = "Sat.htm" End Select Response.Redirect(PageName) End Sub
28
11-4-3 呼叫 Server.Transfer() 方法轉 移到其它網頁 下面是一個例子 : \Ch11\Page1.aspx Sub Page_Load(ByVal sender as Object, ByVal e as System.EventArgs) Context.Items.Add("Message", " 在 Page1 的設定值 ") Response.Write(" 呼叫 Transfer() 方法之前 ") Server.Transfer("Page2.aspx") Response.Write(" 呼叫 Transfer() 方法之後 ") End Sub \Ch11\Page2.aspx Sub Page_Load(ByVal sender as Object, ByVal e as System.EventArgs) Response.Write(" 這是 Page2.aspx 的執行結果 ") Response.Write(Context.Items("Message")) End Sub
29
11-4-3 Server.Transfer vs. Response.Redirect Response.Redirect 瀏覽器知道這項改變 轉移的時候不會保留內建物件的值 Server.Transfer 瀏覽器不知道這項改變 轉移的時候會保留內建物件的值: Context 、 Request 、 Session 、 Application 等 Context 是屬於 HttpContext 型態,也是 Page 物件的一個屬性 練習題:試著改變 Page1.aspx 使得使用 者傳入姓名,但是卻在 Page2.aspx 中顯 示(或者處理)
30
11-4-4 使用超連結導向到其它網頁 如果純粹要讓使用者瀏覽其它網頁, 沒有要進行額外的處理,可以透過 HTML 語法的 … 標籤或 HyperLink 控制項建立超連結。
31
11-5 傳送用戶端指令碼給瀏覽器 Page.ClientScript.RegisterClientScriptBlock(type, key, script) ※ Page.ClientScript.RegisterClientScriptInclude(key, url) ※ Page.ClientScript.RegisterStartupScript(type, key, script) ※ Page.ClientScript.RegisterOnSubmitStatement(type, key, script) ※ Page.ClientScript.IsClientScriptBlockRegistered(key) ※ Page.ClientScript.IsClientScriptIncludeRegistered(key) ※ Page.ClientScript.IsStartupScriptRegistered(key) ※
32
下面是一個例子 :
33
\Ch11\RegisterClientScriptBlock.aspx 01: 02: 03: Sub Page_Load(ByVal sender as Object, ByVal e as System.EventArgs) 04: Dim Script As String 05: Script = " function DoClick() {" 06: Script += "myForm.Message.value=' 成功地傳送用戶端指令碼 '}<" 07: Script += "/Script>" 08: 09: If Not Page.ClientScript.IsClientScriptBlockRegistered("clientScript") Then 10: Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "clientScript", Script) 11: End If 12: End Sub 13: 14: 15: 16: 17: 18: 19: 20: 21:
35
11-6 CallBack PostBack 使用者提交表單並 PostBack 回原網頁 初始化 載入狀態 處理 PostBack 資料 載入 PostBack 事件 儲存狀態 顯示 卸載
36
CallBack 使用者提交表單並 CallBack 回原網頁 初始化 傳回 CallBack 結果 載入狀態 處理 PostBack 資料 載入 CallBack 事件 卸載 JavaScript 事件程序 向伺服器提出 非同步要求
37
撰寫具有 CallBack 功能的 ASP.NET 網頁必須執行下列動作: 實作 ICallbackEventHandler 介面 Partial Class ClientCallback Inherits System.Web.UI.Page Implements System.Web.UI.ICallbackEventHandler 實作 RaiseCallbackEvent() 和 GetCallbackResult() 方法 Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _ Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent cbResult = CInt(Rnd() * 10).ToString() End Sub Public Function GetCallbackResult() As String _ Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult Return cbResult End Function
38
此外,還要包含用戶端指令碼函式以執行下列動作: 傳送 CallBack 給伺服器 Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim cbReference As String = Page.ClientScript.GetCallbackEventReference(Me, _ "arg", "GetNumberFromServer", "context") Dim cbScript As String = "function CallServer(arg, context) { " & cbReference & "};" Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "CallServer", cbScript, True) End Sub 接收 Callback function GetNumber(){ CallServer(); } function GetNumberFromServer(TextBox1, context){ document.form1.TextBox1.value = TextBox1; }
39
Partial Class ClientCallback Inherits System.Web.UI.Page Implements System.Web.UI.ICallbackEventHandler Dim cbResult As String Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim cbReference As String = Page.ClientScript.GetCallbackEventReference(Me, _ "arg", "GetNumberFromServer", "context") Dim cbScript As String = "function CallServer(arg, context) { " & _ cbReference & "};" Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), _ "CallServer", cbScript, True) End Sub Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _ Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent cbResult = CInt(Rnd() * 10).ToString() End Sub Public Function GetCallbackResult() As String _ Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult Return cbResult End Function End Class
40
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="ClientCallback.aspx.vb" Inherits="ClientCallback" %> function GetNumber(){ CallServer(); } function GetNumberFromServer(TextBox1, context){ document.form1.TextBox1.value = TextBox1; } 取得亂數
41
Dim cbResult As String Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent cbResult = CInt(Rnd() * 10).ToString() End Sub Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult Return cbResult End Function Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim cbReference As String = Page.ClientScript.GetCallbackEventReference(Me, "arg", "GetNumberFromServer", "context") Dim cbScript As String = "function CallServer(arg, context) { " & cbReference & "};" Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "CallServer", cbScript, True) End Sub function GetNumber(){ CallServer(); } function GetNumberFromServer(TextBox1, context){ document.form1.TextBox1.value = TextBox1; } 取得亂數
42
CallBack 概念上,與 Web 2.0 (或者 AJAX )相 同 網頁並沒有更新,只有所需要的資料更 新 目前,無法與 FireFox 合用,只能用 於 IE 練習題:請利用亂數的值來決定選擇 某一本書,並將書名列印出來 練習題:由使用者決定選擇某一本書 ,並將書名列印出來
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.