TAHA
09-30-2009, 07:08 AM
تا به حال در مورد تکنولوژی "AJAX" زیاد شنیدید. "AJAX" که از آن به عنوان "Remote Scripting" نیز یاد می شود اجازه ی اجرای دستورات بر روی سرور و برگشت نتایج بدون ارسال صفحه به سرور را میدهد.
کتابخانه ها و پروژه هایی از قبیل AJAX Library، Magic AJAX، Anthemو Atlas برای تسهیل استفاده از این فناوری، تولید و در اختیار برنامه نویسان قرار گرفته است.
در این مقاله قصد بر آن نیست که به جزئیات این تکنولوژی و شرح نحوه ی عملکرد آن پرداخته شود بلکه هدف، معرفی امکان جدیدی است که ASP.NET 2.0 برای استفاده از این تکنولوژی در اختیار برنامه نویسان قرار داده است.
قبل از ادامه بحث بهتره با اصطلاحی که در این مقاله زیاد با اون سر و کار داریم آشنا بشیم.
Client Callback: ارسال درخواست از سمت کلاینت بدون PostBack صفحه، که موجب اجرای یک روال Server-Side و برگشت نتیجه میشود را ""Client Callback مینامیم.
مراحل کار:
1) بار اصلی کار بر عهده ی اینترفیس "ICallbackEventHandler" هست. در هر صفحه ی ASP.NET که قصد استفاده از Client Callback را دارید باید این اینترفیس را ایمپلمنت کنید.
نحوه ی ایمپلمنت کردن یک اینترفیس (این اینترفیس) در دات نت به شکل زیر است:
public partial class CallbacksInAspNet : System.Web.UI.Page, ICallbackEventHandler
{
public string GetCallbackResult()
{
}
public void RaiseCallbackEvent(string eventArgument)
{
}
}
2) اینترفیس "ICallbackEventHandler" دو عضو دارد: "GetCallbackResult" و "RaiseCallbackEvent".
در مورد نقش و نحوه ی استفاده از این دو عضو در ادامه توضیح میدم.
3) نقش جاوا اسکریپت در Client Callbacks نقشی مهم و کلیدی است. برای ارسال درخواست و دریافت نتایج به/از سرور، نیاز به استفاده از جاوا اسکریپت است. خوشبختانه روال کار یکنواخت و ساده است و تنها با چند خط کدنویسی میتوان به نتیجه ی دلخواه رسید.
باید تابع جاوا اسکریپتی ایجاد کرد که وظیفه ی ارسال درخواست به سرور و دریافت نتیجه را انجام بده.
ابتدا باید اطلاعات لازم برای ایجاد این تابع را فراهم کنیم.
این کار از طریق متد ""GetCallbackEventReference کلاس ClientScript در روال Page_Load میسر است.
پارامترهای متد GetCallbackEventReference:
این متد چهار Overload دارد که معمولا از اولین Overload آن استفاده می شود.
پارامتر control:
کنترلی را مشخص می کند که Client Callback در بستر آن انجام می شود. این پارامتر معمولا به فرم جاری اشاره می کند.
پارامتر argument:
مقداری که از سمت کلاینت به سرور (پارامتر eventArgument متد RaiseCallbackEvent) پاس داده می شود و سرور بر مبنای آن نتیجه را برگشت می دهد. توجه داشته باشید که این مقدار ممکن است وجود داشته یا نداشته باشد.
به عنوان مثال در حالتی که قصد بازیابی مقدار ساعت یا تاریخ را از سرور را داریم نیازی به پاس دادن مقداری به سرور نداریم اما اگر قصد ما نمایش اطلاعاتی در صفحه بر مبنای عبارتی خاص است، این پارامتر محتوی آن عبارت خاص است.
پس واضح است که متد RaiseCallbackEvent در حالتی که مقداری از جانب کلاینت به سرور منتقل نمی شود، کاربردی نخواهد داشت.
پارامتر clientCallback:
نام تابع جاوا اسکریپتی در سمت کلاینت که نتیجه پردازش درخواست را دریافت و بر مبنای آن وظیفه ی محوله را انجام می دهد. به عبارت دیگر، نتیجه ی پردازش به این تابع پاس داده می شود.
پارامتر context:
تابع جاوا اسکریپتی که قبل از ارسال درخواست به سرور، اجرا می شود. این تابع معمولا برای ارزیابی داده ها مورد استفاده قرار میگیرد.
پس از دادن اطلاعات کافی به متد فوق، حال زمان ایجاد تابع فرا رسیده.
از متد GetCallbackEventReference متوجه شدید که این متد دو پارامتر ورودی دارد که مقادیر خود را از سمت کلاینت می گیرند. پارامترهای argument و context.
پس تابع ما نیاز به دو پارامتر ورودی دارد.
بدنه ی این تابع نیز از طریق متد GetCallbackEventReference ایجاد می شود.
از متد "RegisterClientScriptBlock" کلاس ClientScript نیز به منظور ایجاد این اسکریپت در سمت کلاینت استفاده می کنیم.
نام تابع جاوا اسکریپت خود را "DoServerAction" می گذاریم.
تمامی گفته های فوق را در قالب کد در ذیل مشاهده می کنید:
protected void Page_Load(object sender, EventArgs e)
{
string CR_REF = ClientScript.GetCallbackEventReference(this, "myValue", "ReceiveDataFromServer", "validateF");
if (!ClientScript.IsClientScriptBlockRegistered("DoServerAction"))
{
string SERVER_SCRIPT = @" function DoServerAction(myValue,validateF) { " + CR_REF + "}";
ClientScript.RegisterClientScriptBlock(this.GetTyp e(), "DoServerAction", SERVER_SCRIPT, true);
}
}
پس از اجرای دستورات فوق، در صورتی که سورس صفحه را مشاهده کنید قسمتی را به شکل زیر خواهید دید:
<script type="text/javascript">
<!--
function DoServerAction (myValue,validateF) {WebForm_DoCallback('__Page',myValue,RecieveDataFr omServer,validateF,null,false)}// -->
</script>
حال زمان پرداختن به دو عضو اینترفیس ICallbackEventHandler یعنی متدهای GetCallbackResult و RaiseCallbackEvent شده است.
متد RaiseCallbackEvent در زمان ایجاد Callback (فراخوانی تابع DoServerAction) فراخوانی می شود و همان طور که پیشتر ذکر شد، مقداری که از سمت کلاینت به سرور پاس داده می شود، در پارامتر eventArgument این متد قرار می گیرد.
متد GetCallbackResult پس از متد RaiseCallbackEvent اجرا می شود و وظیفه ی انتقال داده ها به کلاینت را بر عهده دارد.
توجه مهم:
محدودیتی که در ارتباط با استفاده از Callbacks در ASP.NET 2.0 وجود دارد این است که مقادیر ارسالی به کلاینت تنها می توانند مقادیر رشته ای باشند و "مقادیر نوع دار" قابلیت ارسال شدن ندارند. بنابرین داده ها پیش از آنکه به سمت کلاینت ارسال شوند باید به مقدار رشته ای تبدیل شوند.
بحث را با یک مثال پیش میبرم.
فرض کنید کاربر مقداری را در یک TextBox وارد می کند و شما قصد دارید پیغام مناسبی را بر مبنای مقدار وارد شده توسط وی بر روی صفحه نشان دهید.
با توجه به اطلاعات قبلی می دانید که مقدار TextBox باید در پارامتر اول تابع DoServerAction قرار بگیرد. پس نیاز به تابع جاوا اسکریپتی داریم که این کار را برای ما انجام دهد:
<input type="text" id="txtID" />
<input type="button" value="Submit" onclick="GetID()" />
function GetID()
{
var valueID = document.getElementById("txtID").value;
DoServerAction(valueID,'');
}
قدم به قدم پیش می رویم.
کاربر پس از وارد کردن مقداری در TextBox بر روی دکمه کلیک می کند.
تابع جاوا اسکریپت GetID اجرا می شود. در این تابع، مقدار TextBox در متغیر valueID قرار می گیرد و این متغیر به تابع DoServerAction پاس داده می شود.
تابع DoServerAction اجرا می شود.
مقدار valueID در پارامتر eventArgument متد RaiseCallbackEvent قرار میگیرد و این متد فراخوانی می شود.
این متد وظیفه ی آماده سازی مقدار لازم برای متد GetCallbackResult را بر عهده دارد.
در متد RaiseCallbackEvent به شکل زیر عمل می کنیم:
protected string strReturn;
public void RaiseCallbackEvent(string eventArgument)
{
if (!String.IsNullOrEmpty(eventArgument))
{
strReturn = eventArgument;
}
}
حال متد GetCallbackResult اجرا می شود.
public string GetCallbackResult() {
string strData = strReturn;
string tmp = String.Empty;
switch (strData) {
case "100":
tmp = "Hello";
break;
case "200":
tmp = "my Name is Behrouz";
break;
case "300":
tmp = "barnamenevis.org";
break;
default:
tmp = "Try Again!";
break;
}
return tmp;
}
مقدار برگشتی (متغیر tmp)، در تابع RecieveDataFromServer قرار می گیرد.
این تابع را به شکل زیر ایجاد می کنیم:
function RecieveDataFromServer(strData)
{
document.getElementById("myDiv").innerHTML = strData;
}
"myDiv"، یک تگ DIV است:
<div id="myDiv" runat="server">
مثال فوق تنها یک مثال ساده در ارتباط با بکارگیری Callback ها در ASP.NET 2.0 بود. Callback ها می توانند با DropDownList، TreeView، GridView و بسیاری از کنترل های دیگر در دات نت استفاده شوند.
کتابخانه ها و پروژه هایی از قبیل AJAX Library، Magic AJAX، Anthemو Atlas برای تسهیل استفاده از این فناوری، تولید و در اختیار برنامه نویسان قرار گرفته است.
در این مقاله قصد بر آن نیست که به جزئیات این تکنولوژی و شرح نحوه ی عملکرد آن پرداخته شود بلکه هدف، معرفی امکان جدیدی است که ASP.NET 2.0 برای استفاده از این تکنولوژی در اختیار برنامه نویسان قرار داده است.
قبل از ادامه بحث بهتره با اصطلاحی که در این مقاله زیاد با اون سر و کار داریم آشنا بشیم.
Client Callback: ارسال درخواست از سمت کلاینت بدون PostBack صفحه، که موجب اجرای یک روال Server-Side و برگشت نتیجه میشود را ""Client Callback مینامیم.
مراحل کار:
1) بار اصلی کار بر عهده ی اینترفیس "ICallbackEventHandler" هست. در هر صفحه ی ASP.NET که قصد استفاده از Client Callback را دارید باید این اینترفیس را ایمپلمنت کنید.
نحوه ی ایمپلمنت کردن یک اینترفیس (این اینترفیس) در دات نت به شکل زیر است:
public partial class CallbacksInAspNet : System.Web.UI.Page, ICallbackEventHandler
{
public string GetCallbackResult()
{
}
public void RaiseCallbackEvent(string eventArgument)
{
}
}
2) اینترفیس "ICallbackEventHandler" دو عضو دارد: "GetCallbackResult" و "RaiseCallbackEvent".
در مورد نقش و نحوه ی استفاده از این دو عضو در ادامه توضیح میدم.
3) نقش جاوا اسکریپت در Client Callbacks نقشی مهم و کلیدی است. برای ارسال درخواست و دریافت نتایج به/از سرور، نیاز به استفاده از جاوا اسکریپت است. خوشبختانه روال کار یکنواخت و ساده است و تنها با چند خط کدنویسی میتوان به نتیجه ی دلخواه رسید.
باید تابع جاوا اسکریپتی ایجاد کرد که وظیفه ی ارسال درخواست به سرور و دریافت نتیجه را انجام بده.
ابتدا باید اطلاعات لازم برای ایجاد این تابع را فراهم کنیم.
این کار از طریق متد ""GetCallbackEventReference کلاس ClientScript در روال Page_Load میسر است.
پارامترهای متد GetCallbackEventReference:
این متد چهار Overload دارد که معمولا از اولین Overload آن استفاده می شود.
پارامتر control:
کنترلی را مشخص می کند که Client Callback در بستر آن انجام می شود. این پارامتر معمولا به فرم جاری اشاره می کند.
پارامتر argument:
مقداری که از سمت کلاینت به سرور (پارامتر eventArgument متد RaiseCallbackEvent) پاس داده می شود و سرور بر مبنای آن نتیجه را برگشت می دهد. توجه داشته باشید که این مقدار ممکن است وجود داشته یا نداشته باشد.
به عنوان مثال در حالتی که قصد بازیابی مقدار ساعت یا تاریخ را از سرور را داریم نیازی به پاس دادن مقداری به سرور نداریم اما اگر قصد ما نمایش اطلاعاتی در صفحه بر مبنای عبارتی خاص است، این پارامتر محتوی آن عبارت خاص است.
پس واضح است که متد RaiseCallbackEvent در حالتی که مقداری از جانب کلاینت به سرور منتقل نمی شود، کاربردی نخواهد داشت.
پارامتر clientCallback:
نام تابع جاوا اسکریپتی در سمت کلاینت که نتیجه پردازش درخواست را دریافت و بر مبنای آن وظیفه ی محوله را انجام می دهد. به عبارت دیگر، نتیجه ی پردازش به این تابع پاس داده می شود.
پارامتر context:
تابع جاوا اسکریپتی که قبل از ارسال درخواست به سرور، اجرا می شود. این تابع معمولا برای ارزیابی داده ها مورد استفاده قرار میگیرد.
پس از دادن اطلاعات کافی به متد فوق، حال زمان ایجاد تابع فرا رسیده.
از متد GetCallbackEventReference متوجه شدید که این متد دو پارامتر ورودی دارد که مقادیر خود را از سمت کلاینت می گیرند. پارامترهای argument و context.
پس تابع ما نیاز به دو پارامتر ورودی دارد.
بدنه ی این تابع نیز از طریق متد GetCallbackEventReference ایجاد می شود.
از متد "RegisterClientScriptBlock" کلاس ClientScript نیز به منظور ایجاد این اسکریپت در سمت کلاینت استفاده می کنیم.
نام تابع جاوا اسکریپت خود را "DoServerAction" می گذاریم.
تمامی گفته های فوق را در قالب کد در ذیل مشاهده می کنید:
protected void Page_Load(object sender, EventArgs e)
{
string CR_REF = ClientScript.GetCallbackEventReference(this, "myValue", "ReceiveDataFromServer", "validateF");
if (!ClientScript.IsClientScriptBlockRegistered("DoServerAction"))
{
string SERVER_SCRIPT = @" function DoServerAction(myValue,validateF) { " + CR_REF + "}";
ClientScript.RegisterClientScriptBlock(this.GetTyp e(), "DoServerAction", SERVER_SCRIPT, true);
}
}
پس از اجرای دستورات فوق، در صورتی که سورس صفحه را مشاهده کنید قسمتی را به شکل زیر خواهید دید:
<script type="text/javascript">
<!--
function DoServerAction (myValue,validateF) {WebForm_DoCallback('__Page',myValue,RecieveDataFr omServer,validateF,null,false)}// -->
</script>
حال زمان پرداختن به دو عضو اینترفیس ICallbackEventHandler یعنی متدهای GetCallbackResult و RaiseCallbackEvent شده است.
متد RaiseCallbackEvent در زمان ایجاد Callback (فراخوانی تابع DoServerAction) فراخوانی می شود و همان طور که پیشتر ذکر شد، مقداری که از سمت کلاینت به سرور پاس داده می شود، در پارامتر eventArgument این متد قرار می گیرد.
متد GetCallbackResult پس از متد RaiseCallbackEvent اجرا می شود و وظیفه ی انتقال داده ها به کلاینت را بر عهده دارد.
توجه مهم:
محدودیتی که در ارتباط با استفاده از Callbacks در ASP.NET 2.0 وجود دارد این است که مقادیر ارسالی به کلاینت تنها می توانند مقادیر رشته ای باشند و "مقادیر نوع دار" قابلیت ارسال شدن ندارند. بنابرین داده ها پیش از آنکه به سمت کلاینت ارسال شوند باید به مقدار رشته ای تبدیل شوند.
بحث را با یک مثال پیش میبرم.
فرض کنید کاربر مقداری را در یک TextBox وارد می کند و شما قصد دارید پیغام مناسبی را بر مبنای مقدار وارد شده توسط وی بر روی صفحه نشان دهید.
با توجه به اطلاعات قبلی می دانید که مقدار TextBox باید در پارامتر اول تابع DoServerAction قرار بگیرد. پس نیاز به تابع جاوا اسکریپتی داریم که این کار را برای ما انجام دهد:
<input type="text" id="txtID" />
<input type="button" value="Submit" onclick="GetID()" />
function GetID()
{
var valueID = document.getElementById("txtID").value;
DoServerAction(valueID,'');
}
قدم به قدم پیش می رویم.
کاربر پس از وارد کردن مقداری در TextBox بر روی دکمه کلیک می کند.
تابع جاوا اسکریپت GetID اجرا می شود. در این تابع، مقدار TextBox در متغیر valueID قرار می گیرد و این متغیر به تابع DoServerAction پاس داده می شود.
تابع DoServerAction اجرا می شود.
مقدار valueID در پارامتر eventArgument متد RaiseCallbackEvent قرار میگیرد و این متد فراخوانی می شود.
این متد وظیفه ی آماده سازی مقدار لازم برای متد GetCallbackResult را بر عهده دارد.
در متد RaiseCallbackEvent به شکل زیر عمل می کنیم:
protected string strReturn;
public void RaiseCallbackEvent(string eventArgument)
{
if (!String.IsNullOrEmpty(eventArgument))
{
strReturn = eventArgument;
}
}
حال متد GetCallbackResult اجرا می شود.
public string GetCallbackResult() {
string strData = strReturn;
string tmp = String.Empty;
switch (strData) {
case "100":
tmp = "Hello";
break;
case "200":
tmp = "my Name is Behrouz";
break;
case "300":
tmp = "barnamenevis.org";
break;
default:
tmp = "Try Again!";
break;
}
return tmp;
}
مقدار برگشتی (متغیر tmp)، در تابع RecieveDataFromServer قرار می گیرد.
این تابع را به شکل زیر ایجاد می کنیم:
function RecieveDataFromServer(strData)
{
document.getElementById("myDiv").innerHTML = strData;
}
"myDiv"، یک تگ DIV است:
<div id="myDiv" runat="server">
مثال فوق تنها یک مثال ساده در ارتباط با بکارگیری Callback ها در ASP.NET 2.0 بود. Callback ها می توانند با DropDownList، TreeView، GridView و بسیاری از کنترل های دیگر در دات نت استفاده شوند.