با استفاده از callback feature ميتوان بدون refresh شدن صفحه بوسيله اسكريپت سمت كاربر متغير و يا مقاديري را به صورت asynchronous به سرور فرستاد و پاسخ ارسال شده بوسيله كد سمت كاربر (در اينجا java script) نمايش داده شود.
براي تمرين يك صفحه كه روي آن يك "HTML botton" و يك "TextBox server control" قرار دارد ايجاد كنيد. ميخواهيم وقتي كاربر روي دكمه كليك ميكند سرويس callback آغاز شده و يك عدد تصادفي را در TextBox نمايش دهد.
.aspx page (VB version)
<%@ Page Language=”VB” AutoEventWireup=”false” CodeFile=”RandomNumber.aspx.vb”
Inherits=”RandomNumber” %>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
<title>Callback Page</title>
<script type=”text/javascript”>
function GetNumber(){
UseCallback();
}
function GetRandomNumberFromServer(TextBox1, context){
document.forms[0].TextBox1.value = TextBox1;
}
</script>
</head>
<body>
<form id=”form1” runat=”server”>
<div>
<input id=”Button1” type=”button” value=”Get Random Number”
onclick=”GetNumber()” />
<br />
<br />
<asp:TextBox ID=”TextBox1” Runat=”server”></asp:TextBox>
</div>
</form>
</body>
</html>
VB (code-behind)
Partial Class RandomNumber
Inherits System.Web.UI.Page
Implements System.Web.UI.ICallbackEventHandler
Dim _callbackResult As String = Nothing;
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Dim cbReference As String = Page.ClientScript.GetCallbackEventReference(
Me, “arg”, “GetRandomNumberFromServer”, “context”)
Dim cbScript As String = “function UseCallback(arg, context)” & _
“{“ & cbReference & “;” & “}”
Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), _
“UseCallback”, cbScript, True)
End Sub
Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _
Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
_callbackResult = Rnd().ToString()
End Function
Public Function GetCallbackResult() As String _
Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return _callbackResult
End Function
End Class
وقتي اين صفحه ساخته ميشود و در مرورگر اجرا ميگردد، نتيجه مانند شكل زير خواهد بود.
با نگاهي به صفحه aspx. متوجه ميشويد كه از يك <input type="button"> استفاده كردهايم نه از يك <asp: button> و به همين دليل است كه با كليك بر روي اين دكمه refresh صورت نميگيرد. تنها كاري كه بايد انجام گيرد اين است كه رويداد onclick مربوط به دكمه را به تابع جاوا اسكريپي كه كل پردازش را آغاز ميكند تيظيم كند:
<input id=”Button1” type=”button” value=”Get Random Number”
onclick=”GetNumber()” />
حالا نوبت به كدهاي جاوا اسكريپت ميرسد.() GetNumber اولين تابع جاوا اسكريپت است كه كل پردازش را با فراخواني نام "client script handler" كه در صفحه code behind تعيين شده است، آغاز ميكند.
() GetNumber يك رشته را بوسيله تابع GetRandomNumberFromServer ميگيرد. تنها كاري كه GetRandomNumberFromServer انجام ميدهد اين است كه مقدار رشته گرفته شده را ميگيرد و آن را داخل TextBox نمايش ميدهد:
<script type=”text/javascript”>
function GetNumber(){
UseCallback();
}
function GetRandomNumberFromServer(TextBox1, context){
ASP.NET Server Controls and Client-Side Scripts
document.forms[0].TextBox1.value = TextBox1;
}
</script>
حالا به code behind توجه كنيد. كلاس page از رابط System.Web.UI.ICallbackEventHandler استفاده ميكند.
Partial Class RandomNumber
Inherits System.Web.UI.Page
Implements System.Web.UI.ICallbackEventHandler
‘ Code here
End Class
اين رابط شما را ملزم به استفاده از دو متد ميكند. RaiseCallbackEvent و GetCallbackResult كه هر دو با درخواستهاي اسكريپ سمت كاربر كار ميكنند.
RaiseCallbackEvent شما را قادر ميسازد كه كار گرفتن مقادير از صفحه را انجام دهيد، اما اين مقادير فقط ميتوانند از نوع رشته"string" باشند:
Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _
Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
_callbackResult = Rnd().ToString()
End Function
GetCallbackResult در واقع متدي است كه مقدار برگشتي را براي استفاده ميگيرد:
Public Function GetCallbackResult() As String _
Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return _callbackResult
End Function
رويداد page_load كار ايجاد و قرار دادن client callback script manager كه تابعي است براي درخواستها و پاسخها را مديريت ميكند را نيز انجام ميدهد:
Dim cbReference As String = Page.GetCallbackEventReference(Me, “arg”, _
“GetRandomNumberFromServer”, “context”)
Dim cbScript As String = “function UseCallback(arg, context)” & _
“{“ & cbReference & “;” & “}”
Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), _
“UseCallback”, cbScript, True)