انواع مدل كدينگ در ASP. NET 2.0 ( بخش سوم )
در بخش اول پس از بيان برخی مفاهيم اساسی برنامه های وب به انواع مدل كدينگ در ASP.NET 2.0 و در بخش دوم به روش های ترجمه و مفهوم page class در ASP.NET 2.0 اشاره گرديد. در بخش سوم و نهائی برخی از پرسش های متداول در رابطه با انواع مدل كدينگ در ASP.NET را بررسی و سعی خواهيم كرد كه برای آنها پاسخی مناسب ارائه دهيم .
نواع مدل كدينگ در ASP. NET 2.0 ( بخش سوم )
در بخش اول پس از بيان برخی مفاهيم اساسی برنامه های وب به انواع مدل كدينگ در ASP.NET 2.0 و در بخش دوم به روش های ترجمه و مفهوم page class در ASP.NET 2.0 اشاره گرديد. در بخش سوم و نهائی برخی از پرسش های متداول در رابطه با انواع مدل كدينگ در ASP.NET را بررسی و سعی خواهيم كرد كه برای آنها پاسخی مناسب ارائه دهيم .
برای بسياری از علاقه مندان و پياده كنندگان برنامه های وب ASP. NET پرسش های متعددی در رابطه با ماهيت مدل كدينگ در ASP. NET مطرح می شود . اهم اين پرسش ها عبارتند از :
چگونه فايل های code-behind به صفحات مرتبط می شوند ؟
چگونه تگ های كنترل به متغيرهای صفحه تبديل می شوند ؟
چگونه رويدادها به Event Handler مرتبط می شوند ؟
چگونه فايل های code-behind به صفحات مرتبط می شوند ؟
هر صفحه aspx . با يك دايركتيو صفحه شروع می شود . دايركتيو فوق علاوه بر اين كه زبان برنامه نويسی استفاده شده برای كدينگ صفحه را مشخص می نمايد ، به ASP. NET اعلام می نمايد كه از چه مكانی كد مرتبط با صفحه را پيدا نمايد . با توجه به اين كه در زمان استفاده از روش inline code ، كد به همراه تگ های html و تگ های مختص كنترل های ASP. NET در يك فايل مشابه قرار می گيرد ، دايركتيو اشاره شده سخن خاصی در خصوص مكان كد مرتبط با صفحه را نخواهد داشت .
برای مشخص كردن مكان كد مرتبط با صفحه از چندين روش مختلف می توان استفاده كرد . در نسخه های قبلی ASP. NET ، از خصلت src كه به فايل كد منبع اشاره می نمايد و يا خصلت Inherits برای مشخص كردن نام كلاس ترجمه شده استفاده می گرديد . هر يك از روش های فوق دارای چالش های مختص به خود می باشند . به عنوان نمونه ، در مواردی كه از خصلت Inherits استفاده می گرديد ، پياده كنندگان مجبور به ترجمه كامل كد قبل از بكارگيری نهائی آن می باشند . اين موضوع باعث بروز مشكلات عديده ای برای پياده كنندگان می گرديد ( خصوصا" در گروه های پياده كننده ، چراكه گزينه استاندارد ، ترجمه هر صفحه در يك اسمبلی DLL است ) . مشكل واقعی هر دو روش فوق ، الزام پياده كنندگان به تعريف هر يك از كنترل های وب مورد نياز به عنوان يك member variable است .
در ASP. NET 2.0 ، با استفاده از يك ويژگی جديد با نام partial class اين نوع مشكلات برطرف شده است . ويژگی فوق به پياده كنندگان اجازه می دهد يك كلاس را به چندين فايل كد منبع تقسيم نمايند . در واقع ، عملكرد روش فوق مشابه مدل های قبلی است با اين تفاوت كه تعاريف كنترل ها به سمت يك فايل جداگانه هدايت شده است . پياده كنندگان لازم نيست نگران اين فايل باشند و برای دستيابی به كنترل های صفحه وب می توان از اسامی آنها استفاده كرد .
قطعا" تاكنون واژه partial را در تعريف كلاس برای كد صفحه وب مشاهده كرده ايد .
Partial Class TestCodeBehind
Inherits System.Web.UI.Page
...
End Class
با تغيير اندك در زيرساخت ASP. NET ، به سادگی يك صفحه aspx . با فايل كد منبع توسط خصلت CodeFile مرتبط می گردد .
<%@ Page Language="VB" AutoEventWireup="true" CodeFile="TestCodeBehind.aspx.vb" Inherits="TestCodeBehind" %>
چگونه تگ های كنترل به متغيرهای صفحه مرتبط می گردند ؟
پس از درخواست يك صفحه aspx . در يك مرورگر ، ASP. NET در آغاز سعی می نمايد كه كد فايل مرتبط با صفحه درخواستی را پيدا نمايد . در ادامه برای هر كنترلی كه دارای خصلت runat= server است يك تعريف متغير را توليد می نمايد .
فرض كنيد كه در صفحه aspx . دارای يك كنترل text box به صورت زير باشيم :
<asp:TextBox ID="txtInput" runat="server" />
ASP. NET ، در ادامه تعريف member variable زير را توليد و آن را با استفاده از كلاس های partial به page class ملحق می نمايد .
Protected System.Web.UI.TextBox txtInput
برای حصول اطمينان از اين موضوع كه سيستم به درستی كار می كند ، می بايست فايل aspx . و فايل vb. همسان گردند . در صورتی كه اسامی كنترل ها را با استفاده از ابزاری نظير يك ويرايشگر متن تغيير داده باشيم ، لينك مورد نظر از بين رفته و كد مورد نظر كمپايل نخواهد شد .
توجه داشته باشيد كه متغيرهای كنترل همواره با كليد واژه قابليت دستيابی پذيری protected تعريف می گردند . علت اين موضوع به روش توارث استفاده شده در ASP.NET ( مدل كدينگ صفحه ) برمی گردد .
روش انجام اين كار به صورت زير است :
در ابتدا ، page class از كتابخانه كلاس دات نت قابليت های اوليه را تعريف و به يك صفحه وب اجازه می دهد ساير كنترل ها را هاست نمايد و خود را به Html تفسير و امكان دستيابی به اشياء سنتی ASP نظير Request ، Response و Session را فراهم نمايد .
كلاس code-behind از كلاس صفحه به ارث می رسد تا بتواند توانمندی های اوليه صفحه وب ASP. NET را فراهم نمايد .
در نهايت ، صفحه aspx . از طريق كلاس صفحه سفارشی از كد استفاده می نمايد . اين موضوع باعث می شود كه صفحه فوق بتواند رابط كاربر را با كدی كه آن را حمايت می نمايد ، تركيب نمايد .
عملكرد متغيرهای protected مشابه متغيرهای private با يك تفاوت اساسی است . اين نوع متغيرها قابل دستيابی برای كلاس های مشتق شده می باشند .به عبارت ديگر ، استفاده از متغيرهای protected در كلاس code-behind اين اطمينان را ايجاد می نمايد كه متغيرها در كلاس صفحه مشتق شده قابل دستيابی باشند . اين موضوع به ASP. NET اجازه می دهد كه متغيرهای كنترل را در زمان اجراء به تگ های كنترل مرتبط نمايد .
چگونه رويدادها به Event Handler مرتبط می شوند ؟
اكثر كد نوشته شده در يك صفحه ASP. NET درون event handlers قرار می گيرند تا بتوانند به رويدادهای كنترل های وب واكنش نشان دهند . در ويژوال استوديو دات نت ، با استفاده از سه روش زير می توان يك event handler را اضافه كرد :
تايپ دستی آن : در اين روش می توان متد مورد نظر را مستقيما" در كلاس صفحه اضافه كرد . در چنين مواردی لازم است كه پارامترهای ضروری دقيقا" مشخص گردند تا signature مربوط به event handler با signature رويداد مورد نظر مطابقت نمايد . همچنين لازم است كه تگ كنترل ويرايش گردد تا بتواند به event handler مربوطه به درستی مرتبط گردد .
Double-click بر روی يك كنترل در حالت Design view : در اين حالت ، ويژوال استوديو يك event handler برای رويداد پيش فرض كنترل را ايجاد می نمايد . به عنوان مثال در صورتی كه بر روی صفحه double-click گردد ، event handler مربوط به Page_Load ايجاد می گردد . همچنين ، در صورتی كه بر روی يك كنترل button ، كليك (double-click) گردد، ويژوال استوديو بطور اتوماتيك رويداد Click را برای آن ايجاد خواهد كرد .
انتخاب رويداد از طريق پنجره Properties : در اين روش پس از انتخاب كنترل از طريق پنجره Properties می توان رويداد مورد نظر را انتخاب نمود. در ادامه ، ليستی از رويدادهای ارائه شده توسط كنترل مورد نظر نمايش داده می شوند . با double-click بر روی رويداد مورد نظر می توان آن را انتخاب نمود . ويژوال استوديو بطور اتوماتيك event handler را در page class ايجاد و تگ كنترل را نيز بر اساس آن تنظيم می نمايد .
ويژوال استوديو دانت 2005 از يك ويژگی با نام automatic event wire-up استفاده می نمايد( در دايركتيو صفحه مشخص می گردد).
اين ويژگی از دو اصل كلی زير تبعيت می نمايد :
تمامی event handlers صفحه بطور اتوماتيك و بر اساس نام event handler مرتبط می شوند . به عبارت ديگر ، متد page_Load بطور اتوماتيك و در زمان استقرار صفحه در حافظه صدا زده می شود .
تمامی event handlers كنترل از طريق خصلت های مربوطه در تگ كنترل مرتبط می گردند . خصلت مورد نظر دارای نام مشابه رويداد است كه دارای پيشوند on است .
به عنوان مثال ، در صورتی كه قصد برخورد با رويداد Click مربوط به كنترل Button را داشته باشيم ، می بايست خصلت OnClick در تگ كنترل را به نام event handler مورد نظر مقداردهی نمود . كد زير نحوه انجام اين كار را نشان م دهد :
<asp:Button id="cmdOK" OnClick="cmdOK_Click" runat="server">
كنترل های ASP. NET همواره از گرامر فوق استفاده می نمايند . بخاطر داشته باشيد با توجه به اين كه ASP. NET می بايست به event handler مرتبط گردد ، كلاس صفحه مشتق شده می بايست قادر به دستيابی به كلاس code-behind باشد . اين بدان معنی است كه event handlers می بايست به همراه كليد واژه های Protected و يا Public تعريف شوند ( protected ترجيح داده می شود چراكه از مشاهده متد توسط ساير كلاس ها پيشگيری به عمل می آيد ) .
|