Vahid_moghaddam
پنج شنبه 31 مرداد 1387, 11:29 صبح
Cancelling an Asynchronous PostBack in ASP.NET Ajax (http://barnamenevis.org/forum/\\vahid\Full\cancel postback\cancelpostback.htm)
Suprotim Agarwal
رفتار يك Postback آسنكرون كاملا مشابه يك Postback سنكرون است. در مدل آسنكرون مانند مدل سنكرون تمام رويدادهاي سمت سرور اجرا مي شوند. همچنين كتابخانه Microsoft Ajax امكان توليد رويدادهاي سمت مشتري را نيز فراهم مي كند.
در كتابخانه AJAX كلاسهاي Application(Sys.Application) و PageRequestManager(Sys.WebForms.PageRequestManager ) نسبت به رخدادهای سمت مشتری حساسند. در هنگام استفاده از UpdatePanel با بکار گیری event های کلاس PageRequestManager می توان Postback های آسنکرون را اداره کرد.
به عنوان مثال می توان به لغو کردن Postback آسنکرون اشاره کرد یا به اجازه ندادن اتفاق افتادن Postback های همزمان.
کلاس PageRequestManager دارای رویدادی با نام initializeRequest می باشد که هنگام initialize شدن یک Postback آسنکرون رخ می دهد. این رویداد مکان مناسبی برای لغو کردن یک Postback اسنکرون است. وقتی کاربر درخواستی می فرستد، ابتدا از خصوصیت isInAsyncPostBack در کلاس PageRequestManager استفاده می کنیم تا ببینیم Postback دیگری در حال اجرا می باشد یا نه. اگر بود Postback جدید را لغو می کنیم.
در ادامه این روند پیاده سازی می شود. صفحه ما به شکل زیر است:
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<asp:Button runat="server" Text="PostBackFirst" ID="btnPostF" onclick="btnPostF_Click"/>
<asp:Button runat="server" Text="PostBackSecond" ID="btnPostS" onclick="btnPostS_Click"/>
<asp:Button runat="server" Text="AbortPostBack" ID="btnAbort"/>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
کدهای زیر را اضافه می کنیم:
C#
protected void btnPostF_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(4000);
Label1.Text = "PostBack 1 Completed";
}
protected void btnPostS_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(4000);
Label1.Text = "PostBack 2 Completed";
}
VB.NET
Protected Sub btnPostF_Click(ByVal sender As Object, ByVal e As EventArgs)
System.Threading.Thread.Sleep(4000)
Label1.Text = "PostBack 1 Completed"
End Sub
Protected Sub btnPostS_Click(ByVal sender As Object, ByVal e As EventArgs)
System.Threading.Thread.Sleep(4000)
Label1.Text = "PostBack 2 Completed"
End Sub
در کد بالا System.Threading.Thread.Sleep(4000) تاخیری به مقدار 4 ثانیه ایجاد می کند.
برای رجیستر کردن و استفاده از رویداد initializeRequest کد زیر را به المان <head> اضافه می کنیم.
function pageLoad()
{
Sys.WebForms.PageRequestManager.getInstance().add_ initializeRequest(cancelPostBack);
}
function cancelPostBack(sender, args)
{
if (Sys.WebForms.PageRequestManager.getInstance().get _isInAsyncPostBack())
{
alert('One postback at a time please');
args.set_cancel(true);
}
}
در انتها، برای تکمیل مثال از متد abortPostBack در کلاس PageRequestManager برای خروج از Postback در حال اجرا استفاده می کنیم:
<asp:Button runat="server" Text="AbortPostBack" ID="btnAbort"
OnClientClick="Sys.WebForms.PageRequestManager.getInstance().abor tPostBack();
alert('Postback Cancelled');"/>
کد تمام صفحه:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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 runat="server">
<title>Cancel Async PostBack</title>
<script type="text/javascript">
function pageLoad()
{
Sys.WebForms.PageRequestManager.getInstance().add_ initializeRequest(cancelPostBack);
}
function cancelPostBack(sender, args)
{
if (Sys.WebForms.PageRequestManager.getInstance().get _isInAsyncPostBack())
{
alert('One postback at a time please');
args.set_cancel(true);
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<asp:Button runat="server" Text="PostBackFirst" ID="btnPostF"
onclick="btnPostF_Click"/>
<asp:Button runat="server" Text="PostBackSecond" ID="btnPostS"
onclick="btnPostS_Click"/>
<asp:Button runat="server" Text="AbortPostBack" ID="btnAbort"
OnClientClick="Sys.WebForms.PageRequestManager.getInstance().abor tPostBack();
alert('Postback Cancelled');"/>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
Suprotim Agarwal
رفتار يك Postback آسنكرون كاملا مشابه يك Postback سنكرون است. در مدل آسنكرون مانند مدل سنكرون تمام رويدادهاي سمت سرور اجرا مي شوند. همچنين كتابخانه Microsoft Ajax امكان توليد رويدادهاي سمت مشتري را نيز فراهم مي كند.
در كتابخانه AJAX كلاسهاي Application(Sys.Application) و PageRequestManager(Sys.WebForms.PageRequestManager ) نسبت به رخدادهای سمت مشتری حساسند. در هنگام استفاده از UpdatePanel با بکار گیری event های کلاس PageRequestManager می توان Postback های آسنکرون را اداره کرد.
به عنوان مثال می توان به لغو کردن Postback آسنکرون اشاره کرد یا به اجازه ندادن اتفاق افتادن Postback های همزمان.
کلاس PageRequestManager دارای رویدادی با نام initializeRequest می باشد که هنگام initialize شدن یک Postback آسنکرون رخ می دهد. این رویداد مکان مناسبی برای لغو کردن یک Postback اسنکرون است. وقتی کاربر درخواستی می فرستد، ابتدا از خصوصیت isInAsyncPostBack در کلاس PageRequestManager استفاده می کنیم تا ببینیم Postback دیگری در حال اجرا می باشد یا نه. اگر بود Postback جدید را لغو می کنیم.
در ادامه این روند پیاده سازی می شود. صفحه ما به شکل زیر است:
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<asp:Button runat="server" Text="PostBackFirst" ID="btnPostF" onclick="btnPostF_Click"/>
<asp:Button runat="server" Text="PostBackSecond" ID="btnPostS" onclick="btnPostS_Click"/>
<asp:Button runat="server" Text="AbortPostBack" ID="btnAbort"/>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
کدهای زیر را اضافه می کنیم:
C#
protected void btnPostF_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(4000);
Label1.Text = "PostBack 1 Completed";
}
protected void btnPostS_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(4000);
Label1.Text = "PostBack 2 Completed";
}
VB.NET
Protected Sub btnPostF_Click(ByVal sender As Object, ByVal e As EventArgs)
System.Threading.Thread.Sleep(4000)
Label1.Text = "PostBack 1 Completed"
End Sub
Protected Sub btnPostS_Click(ByVal sender As Object, ByVal e As EventArgs)
System.Threading.Thread.Sleep(4000)
Label1.Text = "PostBack 2 Completed"
End Sub
در کد بالا System.Threading.Thread.Sleep(4000) تاخیری به مقدار 4 ثانیه ایجاد می کند.
برای رجیستر کردن و استفاده از رویداد initializeRequest کد زیر را به المان <head> اضافه می کنیم.
function pageLoad()
{
Sys.WebForms.PageRequestManager.getInstance().add_ initializeRequest(cancelPostBack);
}
function cancelPostBack(sender, args)
{
if (Sys.WebForms.PageRequestManager.getInstance().get _isInAsyncPostBack())
{
alert('One postback at a time please');
args.set_cancel(true);
}
}
در انتها، برای تکمیل مثال از متد abortPostBack در کلاس PageRequestManager برای خروج از Postback در حال اجرا استفاده می کنیم:
<asp:Button runat="server" Text="AbortPostBack" ID="btnAbort"
OnClientClick="Sys.WebForms.PageRequestManager.getInstance().abor tPostBack();
alert('Postback Cancelled');"/>
کد تمام صفحه:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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 runat="server">
<title>Cancel Async PostBack</title>
<script type="text/javascript">
function pageLoad()
{
Sys.WebForms.PageRequestManager.getInstance().add_ initializeRequest(cancelPostBack);
}
function cancelPostBack(sender, args)
{
if (Sys.WebForms.PageRequestManager.getInstance().get _isInAsyncPostBack())
{
alert('One postback at a time please');
args.set_cancel(true);
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<asp:Button runat="server" Text="PostBackFirst" ID="btnPostF"
onclick="btnPostF_Click"/>
<asp:Button runat="server" Text="PostBackSecond" ID="btnPostS"
onclick="btnPostS_Click"/>
<asp:Button runat="server" Text="AbortPostBack" ID="btnAbort"
OnClientClick="Sys.WebForms.PageRequestManager.getInstance().abor tPostBack();
alert('Postback Cancelled');"/>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>