ScriptManager和UpdatePanel控件聯合使用可以實現頁面異步局部更新的效果。其中的UpdatePanel就是設置頁面中異步局部更新區域,它必須依賴於ScriptManager存在,因為ScriptManger控件提供了客戶端腳本生成與管理UpdatePanel的功能。
幾個重要的屬性:
ScriptManager控件的EnablePartialRendering屬性:true-實現頁面的異步局部更新;false-實現全頁面的刷新。
UpdatePanel控件的RenderMode屬性:InLine-UpdatePanel控件被解析成HTML的<span>標記;Block-UpdatePanel控件被解析成Html控件的<DIV>。
UpdatePanel控件的UpdateMode屬性:Always-UpdatePanel頁面上任何一處發生的回發操作都會產生頁局部更新;Conditional-只在特定的情況下才產頁面的回發,如執行UpdatePanel控件的update()方法或在指定的觸發器的操作下。
UpdatePanel控件的ChildAsTrigger屬性:指示UpdatePanel內部控件引起的回發是否產生當前UpdatePanel控件的局部更新。如果UpdateMode設為Always的話,那ChildAsTrigger局性必須設為True,否則運行出錯。
一、UpdatePanel內部的控件引起的回發,來更新當前UpdatePanel內部的控件內容:
1.向頁面中加入ScriptManager、UpdatePanel控件和一個Label控件(Label2)。
2.在UpdatePanel中加入一個Button、一個Label(Label1)。
3.雙擊Button在事件處理程序中寫入下列代碼:Label1.Text = DateTime.Now.ToString();
4.在Page_Load事件中寫入下列代碼:Label2.Text = DateTime.Now.ToString();
5.運行頁面,發現每次點擊按鈕都會產生異步局步刷新,只有Label1的內容發生更改,頁面上的Label2時間沒有發生更改。
代碼如下:
<asp:Label ID="Label2" runat="server" Text="Label"></ASP:Label>
<ASP:ScriptManager ID="ScriptManager1" runat="server">
</ASP:ScriptManager>
<ASP:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="True">
<ContentTemplate>
<asp:Label ID="Label1" runat="server"></ASP:Label>
<br />
<ASP:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</ContentTemplate>
</ASP:UpdatePanel>
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToString(); ;
}
protected void Page_Load(object sender, EventArgs e)
{
Label2.Text = DateTime.Now.ToString();
}
注意:此時的ScriptManager的EnablePartialRendering屬性應設為true。UpdatePanel的UpdateMode屬性應設為Always。ChildAsTrigger屬性應設為true。
二、UpdatePanel控件外部的控件引起的回發,來異步更新UpdatePanel內部的內容:
雖然上面的方式能夠很簡單地實現異步局部更新的功能,但就性能方面考慮,我們應當只將數據確實會發生變化的控件擺放在UpdatePanel中,這就可能會出現引起回發的控件不在UpdatePanel內的情況。
有兩種方式實現這種效果:
a.在Page_Load方法中用ScriptManager1.RegisterAsyncPostBackControl()來注冊一下要實現異步更新的控件。
b.用觸發器來實現。
1、ScriptManager1.RegisterAsyncPostBackControl()注冊的控件可以實現對所有的UpdatePanel控件的異步更新。
如:ScriptManager1.RegisterAsyncPostBackControl(this.Button2);實現對Button2的注冊,那此時Button2的回發就變成一個異步回發(頁面不會刷新),它會導致頁面上所有的UpdatePanel的內容的更新。
注意:此時的ScriptManager的EnablePartialRendering屬性應設為true。UpdatePanel的UpdateMode屬性應設為Always。
2、ScriptManager1.RegisterAsyncPostBackControl()注冊的控件可以實現針對特定UpdatePanel控件的異步更新。
a.把頁面上所有的UpdatePanel控件的UpdateMode設為Conditional。
b.ScriptManager1.RegisterAsyncPostBackControl(this.Button2);實現對Button2的注冊。
c.在Button2控件的Click事件中後面加入後面的代碼:UpdatePanel1.Update();
這樣Button2按鈕只對UpdatePanel1控件實現的異步的局部刷新。
注意:這裡的UpdatePanel的屬性要設為Conditional,如果還是Always的話,會出現所有的UpdatePanel都刷新的效果。
3、觸發器
如果頁面上有多個UpdatePanel控件,如果要實現外部的控件的回發引發指定UpdatePanel的更新的話,那應當為要實現刷新的UpdatePanel控件建立一個觸發器。
a.選中要進行局部更新的UpdatePanel控件。
b.在其屬性頁中點擊Triggers集合屬性右邊的小按鈕。
c.在彈出的對話框中,的成員列表中添加一個AsyncPostBackTriggers成員。
d.指定AsyncPostBackTriggers成員的ControlID和EventName,即引發異步回送的控件的ID和該控件的事件。
完成以上步驟後,切換到Html頁面就會出現下列代碼:
<ASP:UpdatePanel ID="UpdatePanel2" runat="server" RenderMode="Inline" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="Label3" runat="server" Text="Label"></ASP:Label>
</ContentTemplate>
<Triggers>
<ASP:AsyncPostBackTrigger ControlID="Button2" EventName="Click" />
</Triggers>
</ASP:UpdatePanel>
<ASP:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="ButtonOut" />
這裡需要大家注意的是:
把所有的UpdatePanel控件的UpdateMode設為"Conditional",這樣才能夠針對建有相關觸發器的UpdatePanel更新。
一個UpdatePanel上可以建有多個觸發器,實現在不同的情況下對該UpdatePanel控件內容的更新。
三、兩個UpdatePanel控件,其中一個UpdatePanel內的控件引發兩個UpdatePanel控件的同時刷新。
a.在頁面上放入兩個UpdatePanel和一個ScriptManager控件。
b.在UpdatePanel1中加入一個標簽Label1、一個按鈕Button1 ,在UpdatePanel2中加入一個標簽Label2。
c.將UpdatePanel1和UpdatePanel2兩個控件的的UpdateMode屬性設為"Always"
c.在Button1的Click事件中加入下面的代碼:
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToString();
Label2.Text = DateTime.Now.ToString();
}
四、兩個UpdatePanel控件,其中一個UpdatePanel內的控件引發當前的UpdatePanel控件的刷新,而另一個不刷新。
a.步驟和上面的(三)一樣
b.要把UpdatePanel1和UpdatePanel2兩個控件的UpdateMode屬性設為Conditional
<ASP:ScriptManager ID="ScriptManager1" runat="server">
</ASP:ScriptManager>
<ASP:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Label"></ASP:Label>
<br />
<ASP:Button ID="Button1" runat="server" OnClick="Button1_Click1" Text="更新兩個UpdatePanel" />
</ContentTemplate>
</ASP:UpdatePanel>
<ASP:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="Label2" runat="server" Text="Label"></ASP:Label>
</ContentTemplate>
</ASP:UpdatePanel>
五、兩個UpdatePanel控件,其中一個UpdatePanel內的控件引發另一個UpdatePanel控件的刷新,而本身不刷新。
a.步驟和上面的(四)一樣
b.把UpdatePanel1和UpdatePanel2的ChildrenAsTriggers屬性設為false
c.在UpdatePanel2控件中加入一個觸發器,觸發源設到UpdatePanel1控件內的Button1的Click事件上。
<ASP:ScriptManager ID="ScriptManager1" runat="server">
</ASP:ScriptManager>
<ASP:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Label"></ASP:Label>
<br />
<ASP:Button ID="Button1" runat="server" OnClick="Button1_Click1" Text="更新兩個UpdatePanel" />
</ContentTemplate>
</ASP:UpdatePanel>
<ASP:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="Label2" runat="server" Text="Label"></ASP:Label>
</ContentTemplate>
<Triggers>
<ASP:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
</Triggers>
</ASP:UpdatePanel>