使用多個 UpdatePanel 控制項建立簡單的 ASP.NET 頁面
更新:2007 年 11 月
在此教學課程中,您將會在頁面上使用多個 UpdatePanel 控制項。透過在頁面上使用多個 UpdatePanel 控制項,您可用遞增方式單獨或同時更新頁面的多個區域。如需網頁局部更新的詳細資訊,請參閱網頁局部呈現概觀與UpdatePanel 控制項簡介。
必要條件
若要在自己的開發環境中實作這些程序,您需要:
Microsoft Visual Studio 2005 或 Microsoft Visual Web Developer Express 版。
具備 AJAX 能力的 ASP.NET 網站。
建立具有兩個獨立更新區域的頁面
建立新頁面並切換至 [設計] 檢視。
在工具箱的 [AJAX 擴充功能] 索引標籤中,按兩下 ScriptManager 控制項將它加入至頁面。
按兩下工具箱中的 UpdatePanel 控制項兩次,將兩個 UpdatePanel 控制項加入至頁面。
在 [屬性] 視窗中,將兩個 UpdatePanel() 控制項的 UpdateMode 屬性設定為 Conditional。
在其中一個 UpdatePanel 控制項中,加入 Label 控制項,並將其 Text 屬性設定為 Panel Created。
在相同的 UpdatePanel 控制項中,加入 Button 控制項,並將其 Text 屬性設定為 Refresh Panel。
在另一個 UpdatePanel 控制項中,加入 Calendar 控制項。
按兩下 [Refresh Panel] 按鈕,為其 Click 事件加入事件處理常式。
將下列程式碼加入至處理常式,這樣可將 Label 控制項設定為目前的時間。
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Label1.Text = "Panel refreshed at " & _ DateTime.Now.ToString() End Sub
protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "Panel refreshed at " + DateTime.Now.ToString(); }
儲存變更,然後按 CTRL+F5 在瀏覽器中檢視頁面。
按一下這個按鈕。
面板中的文字會變更,以顯示上次重新整理面板內容的時間。
在月曆中,移動到不同的月份。
其他面板中的時間不會變更。兩個面板中的內容會獨立更新。
本範例的樣式是為了以較佳的方式顯示 UpdatePanel 控制項所表示的頁面區域而設定。
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script > Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Label1.Text = "Panel refreshed at " & _ DateTime.Now.ToString() End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>UpdatePanel Tutorial</title> <style type="text/css"> #UpdatePanel1, #UpdatePanel2 { width:300px; height:100px; } </style> </head> <body> <form id="form1" > <div> <asp:ScriptManager id="ScriptManager1" > </asp:ScriptManager> <asp:UpdatePanel id="UpdatePanel1" > <ContentTemplate> <fieldset> <legend>UpdatePanel1</legend> <asp:Label ID="Label1" Text="Panel Created"></asp:Label><br /> <asp:Button ID="Button1" Text="Refresh Panel 1" OnClick="Button1_Click" /> </fieldset> </ContentTemplate> </asp:UpdatePanel> <asp:UpdatePanel ID="UpdatePanel2" > <ContentTemplate> <fieldset> <legend>UpdatePanel2</legend> <asp:Calendar ID="Calendar1" ></asp:Calendar> </fieldset> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body> </html>
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script > protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "Panel refreshed at " + DateTime.Now.ToString(); } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>UpdatePanel Tutorial</title> <style type="text/css"> #UpdatePanel1, #UpdatePanel2 { width:300px; height:100px; } </style> </head> <body> <form id="form1" > <div> <asp:ScriptManager id="ScriptManager1" > </asp:ScriptManager> <asp:UpdatePanel id="UpdatePanel1" > <ContentTemplate> <fieldset> <legend>UpdatePanel1</legend> <asp:Label ID="Label1" Text="Panel Created"></asp:Label><br /> <asp:Button ID="Button1" Text="Refresh Panel 1" OnClick="Button1_Click" /> </fieldset> </ContentTemplate> </asp:UpdatePanel> <asp:UpdatePanel ID="UpdatePanel2" > <ContentTemplate> <fieldset> <legend>UpdatePanel2</legend> <asp:Calendar ID="Calendar1" ></asp:Calendar> </fieldset> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body> </html>
根據預設,UpdatePanel 控制項的 ChildrenAsTriggers 屬性為 true。此屬性設定為 true 時,只要面板中的任何控制項引發回傳,面板內部的控制項就會參與網頁局部更新。
將 UpdatePanel 控制項巢狀化
在某些案例中,將 UpdatePanel 控制項巢狀化可讓您提供原本難以提供的 UI 功能。當您要個別重新整理特定頁面區域以及同時重新整理多個區域時,巢狀面板非常有用。您可以將巢狀外部與同部控制項的 UpdateMode 屬性設定為 Conditional,以完成此動作。若只有內部面板重新整理,此設定將造成外部面板無法重新整理其頁面區域。不過,若重新整理外部面板,也會重新整理巢狀面板。
下列範例示範此概念簡化的形式。
將 UpdatePanel 控制項巢狀化
建立新頁面並切換至 [設計] 檢視。
在工具箱的 [AJAX 擴充功能] 索引標籤中,按兩下 ScriptManager 控制項將它加入至頁面。
在工具箱中,按兩下 UpdatePanel 控制項以將 UpdatePanel 控制項加入至頁面。
按一下 UpdatePanel 控制項內部,然後在工具箱的 [標準] 索引標籤中,按兩下 Button 控制項,將它加入至 UpdatePanel 控制項。
將按鈕的 Text 屬性設定為 Refresh Outer Panel。
在 [屬性] 視窗中,將 UpdatePanel() 控制項的 UpdateMode 屬性設定為 Conditional。
切換至 [原始碼] 檢視,並將下列程式碼加入至 <asp:UpdatePanel> 項目的 <ContentTemplate> 項目內部。
Last refresh <%=DateTime.Now.ToString() %> <br />
Last refresh <%=DateTime.Now.ToString() %> <br />
程式碼會顯示時間,而且會用於指示上次呈現標記的時間。
切換至 [設計] 檢視、按一下 UpdatePanel 控制項內部,然後將第二個 UpdatePanel 控制項加入至第一個面板內部。
在 [屬性] 視窗中,將巢狀 UpdatePanel() 控制項的 UpdateMode 屬性設定為 Conditional。
在巢狀 UpdatePanel 控制項內部加入 Calendar 控制項。
切換至 [原始碼] 檢視,並在巢狀 <asp:UpdatePanel> 項目的 <ContentTemplate> 項目內部加入下列程式碼。
Last refresh <%=DateTime.Now.ToString() %> <br />
Last refresh <%=DateTime.Now.ToString() %> <br />
儲存變更,然後按 CTRL+F5 在瀏覽器中檢視頁面。
當您將巢狀 UpdatePanel 控制項中的月曆移動到上一個月或下一個月時,外部面板的時間不會變更,因為內容不會重新呈現。相反地,當您按一下外部面板中的按鈕時,內部面板中的時間會重新整理。月曆不會變更,因為 Calendar 控制項的 EnableViewState 屬性預設為 true。
本範例的樣式設定為以較佳方式顯示 UpdatePanel 控制項所表示的頁面區域。
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>UpdatePanel Tutorial</title> <style type="text/css"> #UpdatePanel2 { position: relative; margin: 2% 5% 2% 5%; } </style> </head> <body> <form id="form1" > <div> <asp:ScriptManager id="ScriptManager1" > </asp:ScriptManager> <asp:UpdatePanel id="UpdatePanel1" UpdateMode="Conditional" > <ContentTemplate> <fieldset> <legend>Parent UpdatePanel</legend> Last refresh <%=DateTime.Now.ToString() %> <br /> <asp:Button ID="Button1" Text="Refresh Outer Panel" /> <asp:UpdatePanel ID="UpdatePanel2" > <ContentTemplate> <fieldset> <legend>Nested UpdatePanel</legend> Last refresh <%=DateTime.Now.ToString() %> <br /> <asp:Calendar ID="Calendar1" ></asp:Calendar> </fieldset> </ContentTemplate> </asp:UpdatePanel> </fieldset> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body> </html>
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>UpdatePanel Tutorial</title> <style type="text/css"> #UpdatePanel2 { position: relative; margin: 2% 5% 2% 5%; } </style> </head> <body> <form id="form1" > <div> <asp:ScriptManager id="ScriptManager1" > </asp:ScriptManager> <asp:UpdatePanel id="UpdatePanel1" UpdateMode="Conditional" > <ContentTemplate> <fieldset> <legend>Parent UpdatePanel</legend> Last refresh <%=DateTime.Now.ToString() %> <br /> <asp:Button ID="Button1" Text="Refresh Outer Panel" /> <asp:UpdatePanel ID="UpdatePanel2" > <ContentTemplate> <fieldset> <legend>Nested UpdatePanel</legend> Last refresh <%=DateTime.Now.ToString() %> <br /> <asp:Calendar ID="Calendar1" ></asp:Calendar> </fieldset> </ContentTemplate> </asp:UpdatePanel> </fieldset> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body> </html>
注意事項: Calendar 控制項看起來好像沒有更新。根據預設,重新整理月曆時,它會設定為目前的月份與日期。不過,在此步驟中,當您按一下按鈕時,月曆會顯示您先前選取的月份與日期。在封面下,頁面會使用 Calendar 控制項的檢視狀態,以您選取的月份與日期來呈現月曆。這說明 UpdatePanel 控制項執行適當的邏輯,以確定非同步回傳後頁面處於預期的狀態。您可以將 Calendar 控制項的 EnableViewState 屬性設定為 false 並再次執行這些步驟,以測試此狀態。在該案例中,不論您移動到哪個月份,當您按一下該按鈕時,月曆將會還原為顯示目前月份。
檢閱
此教學課程介紹使用網頁上多個 UpdatePanel 控制項的概念。當 UpdatePanel 控制項未巢狀化時,您可以將 UpdateMode 屬性設定為 Conditional,以獨立更新每個面板。(UpdateMode 屬性的預設值是 Always。這會造成面板重新整理以回應任何非同步回傳)。
當面板巢狀化時,行為會有些許不同。若將外部控制項與巢狀控制項的 UpdateMode 屬性設定為 Conditional,可以重新整理內部面板,而不需重新整理外部面板。不過,若重新整理外部更新面板,也會重新整理內部更新面板。