همه ما که با ASP.NET کار می کنیم از سادگی بهره بردن از قابلیت های AJAX با استفاده از کنترل UpdatePanel لذت می بریم . و بعضی مواقع نمی تونیم از وسوسه استفاده از چندین و چند UpdatePanel در یک صفحه مقاومت کنیم . اما متأسفانه شفاف نبودن آنچه در تبادلات بین سرور و کلاینت روی می دهد می تواند باعث بوجود آمدن مشکل برای سایت شود .
بهتر است با یک مثال جلو برویم که همه با آن آشنا هستیم :
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel runat="server" ID="up1">
<ContentTemplate>
<asp:Label runat="server" ID="Label1" Text="Update Me!" /><br />
<asp:Button runat="server" ID="Button1"
Text="Postback Update" OnClick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>
و
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToLongDateString();
}
به همین سادگی . یک کلید فشرده می شود . یک درخواست غیرهمزمان برای زمان و تاریخ جاری ارسال می شود و نتیجه در یک Label نشان داده می شود . حال نگاهی به پشت صحنه می اندازیم و HTTP Post و Response مربوط به این عملیات را بررسی می کنیم .


شوکه کننده است . نه ؟ برای نمایش یک رشته ۲۲ کاراکتری ، این حجم از تبادل داده بسیار زیاد است . شاید برای استفاده معدود و سبک قابل قبول باشد اما در وب سایت های با عملیات های سنگین و بار زیاد باعث دردسر خواهد شد .
خوشبختانه microsoft یک ابزار دیگر رو برای انجام اینگونه عملیات ها در چارچوب فریمورک AJAX.Net در اختیار ما قرار داده ، Page Methods.
Page Method ها این اجازه رو به صفحات AJAX می دن تا مستقیماً توابع static یک صفحه رو با استفاده از JSON اجرا کنن . بجای انجام یک postBack و سپس دریافت کدهای جدید HTML برای جایگزینی کامل محتویات یک UpdatePanel ، می تونیم با استفاده از Page Method فقط همون اطلاعاتی رو که موردنیازمون هست درخواست و دریافت کنیم .
<asp:ScriptManager ID="ScriptManager1" runat="server"
EnablePageMethods="true" />
<script language="javascript">
function UpdateTime() {
PageMethods.GetCurrentDate(OnSucceeded, OnFailed);
}
function OnSucceeded(result, userContext, methodName) {
$get('Label1').innerHTML = result;
}
function OnFailed(error, userContext, methodName) {
$get('Label1').innerHTML = "An error occured.";
}
</script>
<asp:Label runat="server" ID="Label1" Text="Update Me!" /><br />
<input type="button" id="Button2" value="Web Method Update"
onclick="UpdateTime();" />
و
[WebMethod]
public static string GetCurrentDate()
{
return DateTime.Now.ToLongDateString();
}
با این روش ما داده هایی رو که در استفاده از UpdatePanel توسط HTTP Post ارسال می شدن کاملاً حذف و Response رو به آنچه نیاز داریم کاهش دادیم .

در این روش و با استفاده از JSON مقدار کل داده های منتقل شده تنها ۲۴ بایت میشه که در مقایسه با ۸۲۷ بایت روش UpdatePanel بسیار کم است .
یک مزیت دیگر این روش هم این است که سرور نیازی به ساخت مجدد کنترل های درون UpdatePanel و طی کردن life-cycle آنها برای رندر کردن کد های HTML شان ندارد .
اما در کنار همه این حرف ها هم UpdatePanel مزایای خود را دارد و هم Page Methods معایب خود را .
+ مقاله اصلی