‫معرفی کتاب ASP.NET AJAX in Action

حدود ۳ ماه بود که برای آژاکسی کردن یک Web Application نسبتاً بزرگ (با حدود ۳۰۰ صفحه aspx) در حال بررسی راه حل‌های مختلف بودم. بعد از آن که تصمیم گرفتم مابین jQuery و ASP.NET AJAX از ASP.NET AJAX استفاده کنم شروع به یادگیری ASP.NET AJAX کردم. اما بعد از مدتی دیدم بهتر است به جای خواندن مقالات متعدد، یک کتاب خوب پیدا کرده و از روی آن یاد بگیرم. بعد از کمی جستجو سه تا کتاب مناسب پیدا کردم و از بین آن سه کتاب نیز نهایتاً کتاب ASP.Net Ajax in Action را برای مطالعه انتخاب کردم. در ادامه نظرات من را راجع به این کتاب با توجه به این نکات که الف- قرار نیست من کنترل نویسی کنم، ب- تمرکز عمده من باید بر Server Centric باشد نه Client Centric، ج- باید از راه حل‌هایی استفاده کنم که هزینه نگهداری کمتری داشته باشد، د- محیط استفاده Application ما یک محیط اینترانت بدون محدودیت سرعت و کاربران ثابت و همیشگی خیلی معمولی است، می‌خوانید.

این کتاب به دلیل تکرار و مرور مناسب مطالب یادگیری خیلی خوبی دارد و شامل ۱۳ فصل است:
فصل اول: مقدمه‌ای بر فناوری Ajax و ASP.NET Ajax: تقریبا همه برنامه‌نویسان وب به مطالب این فصل اشراف دارند.
فصل دوم: معرفی کتابخانه جاوا اسکریپتی Microsoft Ajax Library: این کتابخانه هم در نوشتن کدهای جاوا اسکریپت بدون در نظر گرفتن آژاکس و ASP.NET مفید است و هم در بحث آژاکس در ASP.NET AJAX. خواندن این فصل به عنوان یک بخش پایه اجباری است.
فصل سوم: یادگیری موثرتر جاوا اسکریپت بر پایه کتابخانه Microsoft Ajax Library: این فصل به شما یاد می‌دهد که چطور با کمک کتابخانه فوق الذکر در جاوا اسکریپت، class، interface، inheritance، enum و… را پیاده سازی کنید. این فصل چه برای آنها که می‌خواهند در فضای client فعال باشند و client centric کار کنند و چه برای آنها که فقط می‌خواهند از UpdatePanel و AjaxControlToolkit کار کنند خیلی ضروری بوده و حتماً باید مطالعه گردد.
فصل چهارم: مروری بر امکانات سمت سرور ASP.NET AJAX: مطالب این فصل که عمدتاً شامل استفاده از UpdatePanel و ScriptManager است را تقریباً همه بلد هستند. در نتیجه نیازی به مطالعه دقیق ندارد.
فصل پنجم: رد و بدل کردن اطلاعات با سرور به طور ناهمزمان از طریق جاوا اسکریپت: مطالعه این فصل دید خیلی خوبی راجع به کار شبکه‌ای می‌دهد. در این فصل نحوه کار با «وب سرویس»ها به طور ناهمزمان (آسنکرون) از طریق جاوا اسکریپت گفته شده که می‌تواند ابزار خیلی راحت و خوبی برای کارهای ساده با سرور باشد.
فصل ششم: کار با UpdatePanel: هر چند این فصل خیلی روی UpdatePanel عمیق نمی‌شود ولی خواندن آن برای یادگیری جزییات کار با UpdatePanel اجباری است.
فصل هفتم: کار با UpdatePanel به طور خیلی تخصصی!: مطالعه و تمرین این فصل به آدم‌های مثل خودم که تمرکزشان روی کنترل‌های سروری است و ترجیح می‌دهند صرفاً از ScriptManager، UpdatePanel و کنترل‌های AjaxControlToolkit است شدیداً توصیه می‌شود.
فصل هشتم و نهم: این دو فصل به مطالعه و بررسی مباحث توسعه Client Centric می‌پردازند و برای افراد علاقه‌مند به Server Centric مثل خودم غیر ضروری هستند.
فصل دهم: Ajax Control Toolkit: مروری مختصر بر Ajax Control Toolkit با تاکید بر مفاهیم Clientی و نحوه توسعه کنترل‌های مربوطه. برای علاقه‌مندان Server Centric بررسی مستقیم خود کنترل‌های Ajax Control Toolkit خیلی مفیدتر است.
فصل یازدهم: XML Script: این فناوری در نسخه‌های اخیر ASP.NET AJAX حذف شده و دیگر ارزش یادگیری ندارد.
فصل دوازدهم: Drag N Drop: چون به آن نیازی نداشتم اصلاً مطالعه نکردم ولی مطمئناً برای افراد علاقه‌مند به درد بخور خواهد بود.
فصل سیزدهم: تمرین آنچه که در ۱۲ فصل گذشته مطالعه شده است. اما چون بیشتر مبتنی بر client بود آن را مطالعه نکردم.
پیوست‌ها، منابع و ایندکس: مطابق هر کتاب دیگری، این سه بخش در خواندن و درک بهتر مطالب کمک خوبی محسوب می‌شوند.

مطالعه بیشتر:
۱- پیوند کتاب در سایت آمازون
۲- پیوند کتاب در سایت ناشر
۳- آشنایی با کتابخانه Microsoft Ajax Library
۴- جاوا اسکریپتی قوی‌تر با Microsoft Ajax Library
۵- ‫فراخوانی Web Service از Client Side
۶- ‫نکاتی تخصصی درباره‌ی UpdatePanel
۷- ‫‫آیا واقعاً بهتر است به جای ASP.NET AJAX از jQuery استفاده کنیم؟
۸- ‫یادگیری ASP.NET AJAX
۹- به روز رسانی صفحات آژاکسی از سمت سرور

‫نکاتی تخصصی درباره‌ی UpdatePanel

سرعت بیشتر با آژاکس!! اگر تا حالا سعی کرده باشید با ASP.NET AJAX (راه حل مایکروسافت برای آژاکسی کردن ASP.NET) کار کرده باشید، در برخورد با کنترل UpdatePanel اقلاً برای یک بار هم که شده با خود فکر کرده‌اید کار با آن خیلی ساده است. اما این فقط ظاهر ماجراست چون آژاکسی کردن با UpdatePanel مشکلات خاص خود را داشته و نیاز به تکنیک‌های خاصی برای حل مشکلات آن هست. در ادامه به مرور چند تا از این مشکلات یا تکنیک‌ها که عمدتاً در بخش ‫۷-۳‬‏ و ‫۷-۴‬ فصل ۷ کتاب ASP.NET Ajax in Action آمده است می‌پردازیم:

۱- تزریق کدهای جاوا اسکریپت که قبلا از طریق Page.ClientScript انجام شد حالا باید از طریق متودهای ScriptManager مثل ScriptManager.RegisterStartupScript انجام شود.

۲- همراه با کنترل UpdatePanel دیگر نمی‌توان از Server.Transfer و Response.Write استفاده کرد. در مورد Server.Transfer باید event کنترل مربوطه، یعنی آن کنترلی که Server.Transfer در کد event آن صدا می‌شود را به عنوان PostBackTrigger کنترل UpdatePanel معرفی کنید. در مورد Response.Write هم اگر صرفاً استفاده‌های دیباگ دارید، یعنی از آن در جاهای مختلف برنامه برای نمایش یک پیغام ساده در صفحه استفاده کرده‌اید بهتر است از معادل جاوا اسکریپتی آن یعنی Sys.Debug.trace به همراه ابزارهایی مثل FireBug استفاده کنید.

۳- تا آنجا که می‌شود UpdatePanel کد کمتری را در بر گیرد. هر چقدر که کدهای محصور شده در ContentTemplate آن کمتر باشد Performance بهتری به دست می‌آید.

۴- UpdatePanel یک property دارد به اسم UpdaetMode. با این که حالت پیش فرض این property برابر Always است سعی کنید آن را همیشه در حالت Conditional نگه دارید مگر آن که مجبور شوید از حالت Always استفاده کنید. این property به UpdatePanel می‌گوید چه وقت‌هایی Update شود و چه وقت‌هایی نشود. این تنظیم صرفاً بر روی Performance تاثیر دارد.

۵- قطع ارتباط کنترل‌های سنگینی مثل GridView از parentشان به وسیله کد جاوا اسکریپت control.parentNode.removeNode(gv)‎. این قطع ارتباط بایستی در pageLoading مربوط به PageRequestManager انجام شود.

۶- وقتی که یک صفحه با UpdatePanel آژاکسی شده است به هنگام کار با آن تا نتیجه یک PostBack آسنکرون از سرور بر نگشته است کاری نکنید که صفحه برای بار دوم و سوم و… PostBack بخورد. چون ASP.NET AJAX نمی‌تواند چند PostBack آسنکرون همزمان را به درستی مدیریت کرده و ممکن است دچار گیجی شود.

۷- بعضی کنترل‌ها هستند که کلاً با UpdatePanel مشکل دارند، برای رفع مشکل این طور کنترل‌ها باید منتظر نسخه‌های بعدی dot net framework باشید. FileUpload نمونه‌ای از کنترل‌هایی بود که در framework 2.0 مشکل داشت و احتمالاً تا حالا (زمان انتشار نسخه‌ی بتا ۲ ویژوال استودیو ۲۰۱۰) مشکلش حل شده باشد.

منبع: فصل ۷ کتاب ASP.NET Ajax in Action

مطالعه بیشتر:
۱- آشنایی با کتابخانه Microsoft Ajax Library
۲- جاوا اسکریپتی قوی‌تر با Microsoft Ajax Library
۳- ‫فراخوانی Web Service از Client Side

به روز رسانی صفحات آژاکسی از سمت سرور

می‌خواستم برای انجام کاری یک صفحه آژاکسی جدید بسازم. وظیفه این صفحه مانیتورینگ یکی از فعالیت‌هایی بود که در Web Server اتفاق می‌افتاد. اولش فکر می‌کردم انجام آن خیلی سخت نباشد. یک Label را وسط یک UpdatePanel می‌گذارم، event سروری مورد نظرم را مشترک شده و سپس در handler آن، Label را به روز رسانی کرده و نهایتاً متود update کنترل UpdatePanel را فراخوانی می‌کنم. اما کار به این سادگی‌ها که فکر می‌کردم نبود. آن event فایر می‌شد، کد handler اجرا می‌شد ولی اصلا کنترل‌های UpdatePanel به روز رسانی نمی‌شدند. با کمی ور رفتن با UpdatePanel فهمیدم که باید آن event به نوعی در Triggers کنترل UpdatePanel قرار می‌گرفت. اما مشکل از آنجا بود که Triggers فقط کنترل‌ها را به عنوان عضو قبول می‌کرد. بعد از کمی جستجوی اعصاب خرد کن دیگر فهمیدم که کار من از بیخ و بن اشتباه و بر خلاف منطق HTTP و آژاکس است! با آژاکس می‌توان صفحه موجود در کلاینت را بدون PostBack به روز رسانی کرد اما این موضوع وقتی اتفاق می‌افتد که یک درخواست از کلاینت به سرور ارسال شود. در مورد کاری که من می‌خواستم انجام دهم هیچ درخواستی از کلاینت وجود ندارد و این سرور است که می‌خواهد بدون درخواست کلاینت به آن اطلاعات بفرستد. شاید شما هم در این لحظه مثل من به یاد صفحه Gmail افتاده باشید و بپرسید پس Gmail چطور این کار را می‌کند؟ همان طور که می‌دانیم اگر صفحه Gmail باز باشد و ایمیل جدیدی به Inbox شما وارد شده باشد این موضوع خود به خود و بدون درخواست قبلی شما در صفحه Gmailتان منعکس می‌گردد. چنین مکانیزمی در friendfeed و twitter هم وجود دارد. کاربر صفحه خاصی از سایت را باز می‌کند و بدون آن که هیچ کاری انجام دهد فقط به صفحه نگاه می‌کند. صفحه هم اتفاقات سمت سرور (رسیدن ایمیل جدید، دریافت تویت جدید، کامنت جدید و…) را بدون درخواست شما در صفحه نمایش می‌دهد.
روشی که Gmail و بقیه استفاده می‌کنند به روش Polling معروف است. در این روش موتور جاوا اسکریپتی آژاکس که در کلاینت فعال است از یک تایمر استفاده کرده و هر چند ثانیه یک بار به سرور متصل شده و در صورت وجود اطلاعات جدید، از سرور درخواست می‌نماید آنها را به کلاینت بفرستد. این طوری کاربر حس می‌کند که این سرور است که اطلاعات جدید را به کلاینت می‌فرستد در حالی که واقعاً باز هم این خود کلاینت است که این درخواست را می‌فرستد.
پیاده‌سازی این مکانیزم در ASP.NET AJAX کار ساده‌ای است. فقط کافیست یک کنترل Timer به صفحه ASPX اضافه کرده و آن را به فهرست Triggers کنترل UpdatePanel اضافه نمایید البته فقط ایونت Tick آن را. سپس بقیه موارد را تنظیم کرده و عملیات مورد نظر خود را به Handler مربوط به Timer.OnTick اضافه کنید. لطفاً اصل ماجرا را در کد زیر مشاهده فرمایید:

<asp:Timer ID=”MyTimer” runat=”server” Interval=”2000″ OnTick=”MyTimer_Tick” Enabled=”true”>
</asp:Timer>
<asp:UpdatePanel ID=”up” runat=”server”>
    <ContentTemplate>
        <asp:TextBox ID=”txaLog” runat=”server” TextMode=”MultiLine” SkinID=”BlackTerminalLTRWide”
            Rows=”20″ Width=”350″ Style=”direction: rtl; text-align: left” />
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID=”MyTimer” EventName=”Tick” />
    </Triggers>
</asp:UpdatePanel>