AJAX.NET的UpdatePanel全面應用(3) (用戶端)

來源:互聯網
上載者:User

http://blog.csdn.net/ccp5780199/archive/2007/08/31/1767677.aspx

AJAX.NET的UpdatePanel全面應用(3) (用戶端)

前面兩篇主要都是服務端方面的,今天這個都是用戶端的,一樣還是看WebCast上的視頻

l PageRequestManager類 (以下簡稱為PRM)

getInstance靜態方法

–獲得全域唯一的PageRequestManager執行個體

isInAsyncPostBack屬性

–是否正處在一個非同步更新過程中

abortPostBack方法

–取消當前的非同步更新

–不會產生異常

l 用戶端生命週期

Sys.Application與PageRequestManager共同形成

Sys._Application的事件

–init事件

基於瀏覽器window.onload事件

只在頁面第一次初始化時觸發

所有指令碼已經載入完畢

所有組件還沒有開始建立

用於建立各種組件

–為組件建立相互參考關聯性的時期

–將在之後的課程中進行詳細介紹

–load事件

–參數類型:Sys.ApplicationLoadEventArgs

components屬性:獲得這次載入階段中所有建立的對象。

isPartialLoad屬性:是否為非同步呼叫導致頁面載入。和IsPostBack差不多

–unload事件僅用於通知

“捷徑”方法

–pageLoad方法

–pageUnload方法

PageRequestManager的事件

–非同步重新整理時觸發

–initializeRequest

–beginRequest

–pageLoading

–pageLoaded

–endRequest

進入頁面

離開頁面

PRM–pageLoaded事件

pageUnload方法

App–init事件

App–unload事件(頁面載入完後)

App–load事件

pageLoad方法

PRM–initializeRequest事件

PRM–beginRequest事件

服務端處理,錯誤逾時取消直接PRM–endRequest事件

PRM –pageLoading事件

PRM–pageLoaded事件

App–load事件

pageLoad方法

PRM–endRequest事件

PRM–initializeRequest事件

參數類型:InitializeRequestEventArgs

–request屬性:用於獲得WebRequest對象(用於請求的資訊)

–postBackElement:觸發非同步重新整理的DOM元素

常用操作:

–讀取請求資訊

–取消此次非同步更新

非同步重新整理層級

<div>

<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode=Debug>

</asp:ScriptManager>

<asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout=false>

<ProgressTemplate>

<span style="color:Red">loading.....</span>

</ProgressTemplate>

</asp:UpdateProgress>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<%= DateTime.Now %>><br />

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

<asp:Button ID="btnPrecedence" runat="server" Text="優先" OnClick="btnPrecedence_Click" />

<asp:Button ID="Button2" runat="server" Text="普通" OnClick="btnPrecedence_Click" />

</ContentTemplate>

</asp:UpdatePanel>

<script language=javascript type="text/javascript">

var lastPostBackButtonID = null;

var btnPrecedenceID = "<%= this.btnPrecedence.ClientID %>";

Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(

function(sender,e){

var prm = Sys.WebForms.PageRequestManager.getInstance();

//是否處在一個非同步更新過程中

if(prm.get_isInAsyncPostBack()) {

//如果發起非同步重新整理的DOM元素的ID等於優先控制項的ID

if(lastPostBackButtonID == btnPrecedenceID){

e.set_cancel(true);

//如果發起非同步重新整理的DOM元素的ID等於優先控制項的ID

if(e.get_postBackElement().id == btnPrecedenceID){

showMessage("不可重複發起優先的重新整理");

}

else{

showMessage("請等待優先的重新整理結束");

}

return;

}

else if(e.get_postBackElement().id == btnPrecedenceID){

showMessage("發起優先的重新整理,普通的重新整理將被取消");

}

else{

showMessage("重新發起普通的重新整理,前一次提交將被取消");

}

}

lastPostBackButtonID = e.get_postBackElement().id;

}

);

var timeoutSeed = null;

function showMessage(message,timeout){

$get("message").innerHTML = message;

if(timeoutSeed){

window.clearTimeout(timeoutSeed);

}

timeoutSeed = window.setTimeout(

function(){ $get("message").innerHTML = ""; },

timeout || 2500);

}

</script>

</div>

<div id="message" style="color:Red" ;></div>

protected void btnPrecedence_Click(object sender, EventArgs e)

{

Thread.Sleep(3000);

Button btn = sender as Button;

this.Label1.Text = String.Format("您點擊了 {0} 按鈕 ", btn.Text);

}

PRM –beginRequest事件

參數類型:BeginRequestEventArgs

–request屬性:用於獲得WebRequest對象(用於請求的資訊)

–postBackElement:觸發非同步重新整理的DOM元素

常用操作:

–讀取請求資訊

–改變請求方式(替換Executor)

–顯示更新提示

強制顯示UpdateProgress

<asp:ScriptManager ID="ScriptManager1" runat="server">

</asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<%= DateTime.Now %>

<asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button1_Click" />

</ContentTemplate>

<Triggers>

<asp:AsyncPostBackTrigger ControlID="Button2" />

</Triggers>

</asp:UpdatePanel>

<asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter=0 DynamicLayout=false AssociatedUpdatePanelID="UpdatePanel1">

<ProgressTemplate>

<span style="color:Red">Loading....</span>

</ProgressTemplate>

</asp:UpdateProgress>

<hr />

<asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button1_Click" />

<script language=javascript type="text/javascript">

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(

function(sender,e){

if(e.get_postBackElement().id != "<%= this.Button2.ClientID %>") {

return;

}

var updateProgress = $get("<%= this.UpdateProgress1.ClientID %>")

var dynamicLayout = <%= this.UpdateProgress1.DynamicLayout.ToString().ToLower() %>

if(dynamicLayout){

updateProgress.style.display = "block";

}

else {

updateProgress.style.visibility = "visible";

}

}

);

</script>

PRM–pageLoading事件

參數類型:PageLoadingEventArgs

–dataItems屬性:獲得伺服器端註冊的資料項目

–panelsDeleting屬性:獲得即將刪除的UpdatePanel

–panelsUpdating屬性:獲得即將更新的UpdatePanel

常用操作

–提示更新的UpdatePanel

–(能夠)獲得伺服器端註冊的資料項目

提示更新的UpdatePanel

<script language="javascript" type="text/javascript">

function highlightPanels(panels, clear)

{

for (var i = 0; i < panels.length; i++)

{

var panel = panels[i];

panel.style.border = clear ? "solid 0px white" : "solid 2px red";

panel.style.backgroundColor = clear ? "white" : "#d6dde8";

}

}

Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(

function(sender, e)

{

var panelsUpdating = Array.clone(e.get_panelsUpdating());

highlightPanels(panelsUpdating);

window.setTimeout(

function(){ highlightPanels(panelsUpdating, true); },

2000);

});

</script>

PRM–pageLoaded事件

參數類型:PageLoadedEventArgs

–dataItems屬性:獲得伺服器端註冊的資料項目

–panelsCreated屬性:獲得建立的UpdatePanel,用於嵌套UpdatePanel

–panelsUpdated屬性:獲得已經更新的UpdatePanel

常用操作:

–(能夠)獲得伺服器端註冊的資料項目

–(能夠)執行伺服器端註冊的指令碼

局部內容添加

public class Comment

{

public string Content;

public DateTime Time;

}

<strong>Comment:</strong> <br /><br />

<asp:ScriptManager ID="ScriptManager1" runat="server">

</asp:ScriptManager>

<div id="commentContainer">

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<asp:Repeater ID="Repeater1" runat="server">

<ItemTemplate>

<%# (Container.DataItem as Comment).Content %><br />

<i><%# (Container.DataItem as Comment).Time %></i>

<hr />

</ItemTemplate>

</asp:Repeater>

</ContentTemplate>

<Triggers>

<asp:AsyncPostBackTrigger ControlID="Button1" />

</Triggers>

</asp:UpdatePanel>

</div>

<br />

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

<asp:Button ID="Button1" runat="server" Text="Add Comment" OnClick="Button1_Click" />

<script language=javascript type="text/javascript">

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(

function(sender,e){

var upID = "<%= this.UpdatePanel1.ClientID %>";

var refreshedPanels = e.get_panelsUpdated();

for(var i=0; i < refreshedPanels.length; i++) {

if(refreshedPanels[i].id == upID){

refreshedPanels[i].id = upID + Math.floor(9999 * Math.random());

var div = document.createElement("div");

div.id = upID;

$get("commentContainer").appendChild(div);

return;

}

}

}

);

</script>

主要還是在於每次發送的資料不會遞增

PRM–endRequest事件

參數類型:EndRequestEventArgs

–dataItems屬性:獲得伺服器端註冊的資料項目

–error屬性:獲得非同步重新整理時獲得的錯誤

–errorHandled屬性:表明錯誤是否已被處理了

–response屬性:獲得這次請求獲得的結果對象

•常用操作:

–處理非同步重新整理結果(異常、逾時、取消, etc.)

–獲得請求結果中額外的資訊

–(能夠)獲得伺服器端註冊的資料項目

處理非同步重新整理結果

protected void Page_Load(object sender, EventArgs e)

{

ScriptManager.GetCurrent(this).AsyncPostBackTimeout = 3;

}

protected void btnError_Click(object sender, EventArgs e)

{

int two = 2;

int i = 3 / (two - 2);

}

protected void btnTimeout_Click(object sender, EventArgs e)

{

Thread.Sleep(5000);

}

protected void btnDataItem_Click(object sender, EventArgs e)

{

ScriptManager.GetCurrent(this).RegisterDataItem(this.UpdatePanel1, DateTime.Now.ToString());

}

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<%= DateTime.Now %><br />

<asp:Button ID="btnError" runat="server" Text="Error" OnClick="btnError_Click" />

<asp:Button ID="btnTimeout" runat="server" Text="Timeout" OnClick="btnTimeout_Click" />

<input type="button" value="Abort" onclick="Sys.WebForms.PageRequestManager.getInstance().abortPostBack();" />

<asp:Button ID="btnDataItem" runat="server" Text="Register DataItem" OnClick="btnDataItem_Click" />

</ContentTemplate>

</asp:UpdatePanel>

<script language="javascript" type="text/javascript">

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(

function(sender, e)

{

if (e.get_error())

{

e.set_errorHandled(true);

if (e.get_response().get_timedOut())

{

showMessage("您的請求已逾時。");

}

else if (e.get_response().get_statusCode() != 200)

{

showMessage("遇到未知錯誤。");

}

else

{

showMessage(e.get_error().message);

}

}

else if (e.get_response().get_aborted())

{

showMessage("您的請求已被取消。");

}

else

{

var upId = "<%= this.UpdatePanel1.ClientID %>";

var item = e.get_dataItems()[upId];

showMessage("您註冊了:" + item);

}

});

</script>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.