昨天做了個最簡單的Atlas應用,其中用到了ScriptManager和UpdatePanel兩個控件,今天來了解一下UpdatePanel的UpdateMode屬性。UpdateMode有兩個值:always 和 conditional,通過這兩個值可以用來控制UpdatePanel的刷新方式。
1. always :如果將UpdateMode屬性設為"always",則每次發生頁面回發的時候,該UpdatePanel都會刷新。這裡的頁面回發包括由其他UpdatePanel裡的控件或不在UpdatePanel裡的控件產生的回發。接著昨天的例子稍做一下改動:
<ASP:UpdatePanel ID="up1" runat="server">
<ContentTemplate>
<asp:Label ID="lblTime" runat="server"></ASP:Label><br />
<ASP:Button ID="btnShowTime" runat="server" Text="ShowTime" OnClick="btnShowTime_Click" />
</ContentTemplate>
</ASP:UpdatePanel>
<ASP:UpdatePanel ID="up2" runat="server" UpdateMode="always">
<ContentTemplate>
always UpdatePanel:
<asp:Label ID="lblAlwaysTime" runat="server"></ASP:Label>
</ContentTemplate>
</ASP:UpdatePanel>
CodeFile:
protected void btnShowTime_Click(object sender, EventArgs e)
{
lblTime.Text = DateTime.Now.ToString();
lblAlwaysTime.Text = DateTime.Now.ToString();
}
此時如果點擊"ShowTime"按鈕,兩個UpdatePanel裡的Label會同時更新,但如果將第二個UpdatePanel的UpdateMode設為conditional,她裡面的Label就不會更新了。
2.conditional:若UpdateMode被設為conditional,則該UpdatePanel會在下列情況被刷新:
(1) 由觸發器引起的刷新,如下所示:
<ASP:UpdatePanel ID="up2" runat="server" UpdateMode="conditional">
<ContentTemplate>
always UpdatePanel:
<asp:Label ID="lblAlwaysTime" runat="server"></ASP:Label>
</ContentTemplate>
<Triggers>
<ASP:AsyncPostBackTrigger ControlID="btnShowTime" EventName="Click" />
</Triggers>
</ASP:UpdatePanel>
通過在UpdatePanel裡設置觸發器可以指定特定的按鈕來刷新該UpdatePanel.上例中就給UpdatePanel設置了一個觸發器,該觸發器關聯的控件是"btnShowTime",關聯的事件是 "Click"。一個UpdatePanel可以設置多個觸發器,關於觸發器更深一步的知識我想以後會慢慢了解。
(2) 調用UpdatePanel的Update()方法:
protected void btnShowTime_Click(object sender, EventArgs e)
{
lblTime.Text = DateTime.Now.ToString();
lblAlwaysTime.Text = DateTime.Now.ToString();
up2.Update();
}
(3) 當該UpdatePanel在其他UpdatePanel裡面,並且父容器更新的時候:
<ASP:UpdatePanel ID="up1" runat="server">
<ContentTemplate>
<asp:Label ID="lblTime" runat="server"></ASP:Label><br />
<ASP:Button ID="btnShowTime" runat="server" Text="ShowTime" OnClick="btnShowTime_Click" />
<ASP:UpdatePanel ID="up2" runat="server" UpdateMode="conditional">
<ContentTemplate>
always UpdatePanel:
<asp:Label ID="lblAlwaysTime" runat="server"></ASP:Label>
</ContentTemplate>
</ASP:UpdatePanel>
</ContentTemplate>
</ASP:UpdatePanel>
(4) 當 ChildrenAsTriggers 屬性為true,UpdatePanel 內的控件產生回發時,其實昨天的例子就和這種情況差不多。因為默認情況下ChildrenAsTriggers的值為true ,可以省略,此是UpdateMode不管為always還是conditional效果是一樣的。需要注意的是子UpdatePanel裡的控件並不會引起父UpdatePanel的更新,需要顯示的申明為觸發器或者調用父UpdatePanel的Update()方法。
注意:如果ChildrenAsTriggers設為false,則UpdateMode的值必須設為conditional,否則就會拋出異常。默認情況下UpdateMode的值為always。