انواع مدل كدينگ در ASP. NET 2.0

پس از عرضه ASP.NET 2.0 ، تغييرات گسترده ای در خصوص نحوه كدينگ برنامه های‌ وب ايجاد گرديد . پياده كنندگان برنامه های وب كه از فناوری فوق برای پياده سازی برنامه های وب استفاده می نمايند ، می بايست با اين تغييرات و دستاوردهای آن به خوبی آشنا شوند تا بتوانند برنامه هائی را ايجاد نمايند كه ظاهر و باطن آنها با استفاده از آخرين فناوری های موجود پياده سازی شده باشد .
دوشنبه، 7 بهمن 1387
تخمین زمان مطالعه:
موارد بیشتر برای شما
انواع مدل كدينگ در ASP. NET 2.0
انواع مدل كدينگ در ASP. NET 2.0
انواع مدل كدينگ در ASP. NET 2.0

پس از عرضه ASP.NET 2.0 ، تغييرات گسترده ای در خصوص نحوه كدينگ برنامه های‌ وب ايجاد گرديد . پياده كنندگان برنامه های وب كه از فناوری فوق برای پياده سازی برنامه های وب استفاده می نمايند ، می بايست با اين تغييرات و دستاوردهای آن به خوبی آشنا شوند تا بتوانند برنامه هائی را ايجاد نمايند كه ظاهر و باطن آنها با استفاده از آخرين فناوری های موجود پياده سازی شده باشد .
به دليل اهميت اين موضوع بر آن شديم كه در سه مقاله جداگانه با گزينه های موجود برای كدينگ يك صفحه وب آشنا شويم و به چندين پرسش اساسی در اين رابطه پاسخ دهيم . در اولين بخش ، پس از بررسی اجمالی برخی نكات اوليه و مهم كه بيشتر جنبه يادآوری دارد به بررسی انواع مدل كدينگ در ASP.NET 2.0 خواهيم پرداخت .

يادآوری !

پياده كنندگان برنامه های وب كه از فناوری ASP. NET برای توليد محتويات پويا استفاده می كنند ، برای پياده سازی برنامه های خود می توانند از ابزارهای مختلفی استفاده نمايند . در اكثر وب سايت های بزرگ برای توليد برنامه های وب از ويژوال استوديو استفاده می گردد . اين ابزار پياده سازی حرفه ای ، شامل مجموعه ای غنی از ابزارهای طراحی ، امكانات گسترده جهت اشكال زدائی و تسهيلات كمكی مناسب در زمان كدينگ است .
ويژوال استوديو ، همچنين ازمدل code-behind حمايت می نمايد كه در آن كد از تگ ها و ساير علائم نشانه گذاری موجود در يك صفحه وب تفكيك می گردد .
برای ايجاد يك برنامه در ويژوال استوديو 2005 به دو پتانسيل سطح بالا نياز است :
• كمپايلر كه مسئوليت بررسی كد نوشته شده و ترجمه آن به يك كد سطح پائين تر را برعهده دارد ( در اين مورد خاص ، ترجمه به IL ) .
• IDE ( برگرفته شده از Integrated Development Environment ) كه به پياده كنندگان امكان نوشتن كد مورد نياز برای ايجاد يك برنامه وب را می دهد .
برای پياده سازی يك برنامه وب ASP.NET ، بكارگيری ويژوال استوديو دات نت يك الزام نيست و پياده كنندگان می تواند برای كدينگ برنامه خود از يك برنامه ويرايشگر ( نظير notepad ) نيز استفاده نمايند .
در زمان پياده سازی يك برنامه وب ، ارائه تسهيلات لازم برای كدينگ از جمله خواسته های مشترك تمامی پياده كنندگان است تا آنان بتوانند صرفنظر از ميزان توانمندی ، سرود خلاقيت خود را آنچنان كه بايسته و شايسته است به گوش مخاطبان برسانند . شايد به همين دليل باشد كه ويژوال استوديو دات نت برای پياده كنندگان برنامه های وب ASP.NET ، به عنوان اولين گزينه ابزار پياده سازی مطرح می گردد .
با جداسازی ابزارهای پياده سازی و كمپايلر ها اين امكان در اختيار پياده كنندگان گذاشته شده است كه هر يك از ابزار مورد علاقه خود برای پياده سازی برنامه های وب ASP.NET استفاده نمايند و در ادامه اقدام به ترجمه آن نمايند .
به همراه دات نت كمپايلرهای متعددی ارائه شده است :
• كمپايلر ويژوال بيسيك ( فايل vbc.exe )
• كمپايلر #C ( فايل csc.exe )
• كمپايلر JScript ( فايل jsc.exe )
• كمپايلر #J ( فايل vjc.exe )
در صورتی كه قصد استفاده از برنامه های مترجم فوق را بطور دستی داشته می باشيم ، می توان آنها را از طريق خط دستور فعال كرد . كمپايلرهای فوق در آدرس c:\[WinDir]\Microsoft.NET\[Version] قرار دارند كه در آن WinDir ، دايركتوری محل نصب سيستم عامل ( نظير c:\windows ) و Version شماره نسخه دات نت نصب شده بر روی كامپيوتر است ( نظير v2.0.50215 ) .
استفاده از كمپايلرهای دات نت بطور دستی توصيه نمی گردد چراكه در چنين مواردی می بايست فايل مورد نظر جهت ترجمه و ساير اسمبلی های مورد نياز را مشخص نمود . همچنين لازم است تمامی برنامه را ترجمه و يا هر صفحه را بطور جداگانه ترجمه نمود . برای پيشگيری از اين نوع مسائل جانبی و مشكل ساز ، اكثر پياده كنندگان از امكانات حمايتی تعبيه شده برای ترجمه صفحات در ويژوال استوديو استفاده می نمايند .
در ASP.NET 1.x ، ويژوال استوديو تمامی صفحات وب را در يك اسمبلی DLL ترجمه می كرد . در ويژوال استوديو 2005 ، رويكرد فوق تغيير يافته است و به ASP.NET اجازه داه می شود كه برای هر صفحه در اولين مرتبه دستيابی ، ترجمه را انجام دهد . سياست فوق باعث شده است كه سرعت اشكال زدائی افزايش يافته و پياده كنندگان بتوانند وب سايت هائی پياده سازی نمايند كه در آنها صفحات وب با زبان های مختلفی نوشته شده باشند .

انواع مدل كدينگ

برای كدينگ صفحات وب و سرويس های وب می توان از دو مدل مختلف استفاده كرد :
• Inline code : اين مدل به صفحات كلاسيك ASP نزديك تر است و در آن تمامی كد به همراه تگ های Html در يك فايل aspx . ذخيره می گردد . كد مورد نياز در يك و يا چندين بلاك اسكريپت قرار می گيرد . با قرار دادن كدها در يك بلاك اسكريپت ، در صورتی كه در محيط ويژوال استوديو كار می كنيم همچنان امكان استفاده از پتانسيل هائی نظير اشكال زدائی و IntelliSense ، تعامل با رويدادها و استفاده از برنامه های جانبی وجود خواهد داشت . اين مدل به سهولت قابل استفاده است چراكه همه چيز در يك پكيچ نگهداری می گردد و برای كدينگ صفحات وب ساده مناسب است .
• code-Behind : در اين مدل هر صفحه ASP.NET در دو فايل جداگانه نگهداری می گردد. اولين فايل كه به فايل markup موسوم است شامل تگ های Html و تگ های كنترل های مختص ASP.NET است كه دارای انشعاب aspx . است . دومين فايل ، شامل كد مورد نياز با توجه به اهداف عملياتی يك صفحه وب است . اين فايل با توجه به اين كه از چه زبانی برای نوشتن كدها استفاده شده است دارای انشعاب متفاوتی خواهد بود . به عنوان نمونه در صورتی كه برای كدينگ از زبان VB.NET استفاده شده باشد ، انشعاب اين فايل vb . و در صورتی كه از زبان #C استفاده شده باشد ، انشعاب آن cs. خواهد بود . مدل فوق سازماندهی بهتری را ارائه می نمايد و بخش رابط كاربر را از منطق برنامه نويسی مجزا می نمايد . اين وضعيت خصوصا" در مواردی كه قصد پياده سازی صفحات وب پيچيده را داشته باشيم ، بسيار مفيد و موثر خواهد بود . در ويژوال استوديو 2005 پياده سازی مدل code-behind تغيير يافته است ولی فلسفه كلی كار با نسخه های قبلی تا حدود زيادی مشابه است .
در NET 1.x. ابزار طراحی استفاده شده برای پياده سازی ، نوع مدل كدينگ را مشخص می كرد . در ويژوال استوديو شما دارای آزادی عمل در خصوص انتخاب هر يك از گزينه های فوق می باشيد . زمانی كه يك صفحه وب جديد را به وب سايت خود اضافه می نمايد ، با انتخاب و يا عدم گزينش Place Code in Separate File می توان در اين رابطه تصميم گرفت .
در يك پروژه و يا برنامه وب می توان از دو مدل فوق استفاده كرد . شكل 1 ، نحوه عمليات فوق را نشان می دهد ( انتخاب گزينه Web site و در ادامه Add New Item )
مثال
برای آشنائی بيشتر با روش Inline code و يا code-Behind يك نمونه مثال را با يكديگر بررسی می نمائيم .
روش كدينگ Inline code : همه چيز در يك فايل و با نام TestInlineCode.aspx خلاصه شده است. كد زير نحوه انجام اين كار را نشان می دهد .

روش  Inline code : فايل TestInlineCode.aspx

<%@ Page Language="VB" %>

<script runat="server">
  Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
     Label1.Text = "Current time: " & DateTime.Now.ToLongTimeString()
  End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
  <title>Test Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
   <asp:Label ID="Label1" runat="server" Text="Click Me!"> </asp:Label>
   <br />
   <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</div>
</form>
</body>
</html>

روش code-behind : در اين مدل از دو فايل استفاده شده است : فايل TestCodeBehind.aspx كه شامل تگ های html و تگ های كنترل های مختص ASP.NET است و بخش رابط كاربر برنامه را تشكيل می دهد و فايل TestCodeBehind.aspx.vb كه حاوی كد مورد نياز صفحه وب با توجه به اهداف عملياتی است .
كد زير محتويات فايل TestCodeBehind.aspx را نشان می دهد .

روش  Inline code : فايل TestInlineCode.aspx

<%@ Page Language="VB" %>

<script runat="server">
  Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
     Label1.Text = "Current time: " & DateTime.Now.ToLongTimeString()
  End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
  <title>Test Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
   <asp:Label ID="Label1" runat="server" Text="Click Me!"> </asp:Label>
   <br />
   <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</div>
</form>
</body>
</html>

كد زير محتويات فايل TestCodeBehind.aspx.vb را نشان می دهد .

روش code-behind  : فايل TestCodeBehind.aspx.vb

Partial Class TestCodeBehind
  Inherits System.Web.UI.Page
  Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
       Label1.Text = "Current time: " & DateTime.Now.ToLongTimeString()
  End Sub
End Class

در كلاس صفحه ( TestCodeBehind ) ، تمامی متدهای صفحه تعريف می گردند .

جمع بندی

• مدل code-behind برای صفحات پيچيده ترجيح داده می شود.
• با اين كه مدل inline code برای صفحات كوچك ، فشرده و مناسب تر به نظر می آيد ولی همزمان با رشد كد و Html برای بسياری از پياده كنندگان راحت تر است كه با دو بخش فوق بطور جداگانه سروكار داشته باشند .
• در مدل code-behind با توجه به اين كه دقيقا" مشخص می گردد كه چه كلاسی ايجاد شده است و از چه namespace استفاده شده است ، شاهد شفافيت بيشتری در كد خواهيم بود.
• در مدل code-behind می توان اين امكان را در اختيار يك طراح وب قرار داد كه صرفا" بخش رابط كاربر را ايجاد و يا تصحيح نمايد ، بدون اين كه لازم باشد وی به كد برنامه دستيابی داشته باشد .

روش های ترجمه در ASP.NET 2.0

ASP.NET به همراه خود يك مدل ترجمه را ارائه داده است كه در آن اسمبلی ها به صورت پويا ترجمه می گردند . برنامه همواره به عنوان يك نسخه ترجمه شده ( با هدف افزايش كارآئی ) اجراء می گردد .
ASP.NET از سه روش مختلف برای ترجمه برنامه های وب استفاده می كند :
• Classic precompilation : اين مدل ترجمه همزمان با عرضه اولين نسخه ASP.NET ارائه گرديد . در اين روش ، بخش هائی از وب سايت نظير فايل های code-behind و هر نوع اسمبلی مرجع ترجمه و بخش هائی ديگر نظير فايل های حاوی تگ (فايل های aspx . ، و ASMX ) در زمان اجراء و همزمان با اولين مرتبه درخواست ، بطور پويا ترجمه می شوند . از مدل فوق صرفا" به همراه مدل code-behind سنتی كه در آن صفحه واقعی از كلاس پايه ترجمه شده به ارث رسيده باشد ، می توان استفاده كرد.
در روش فوق ، فايل های code-behind به اسمبلی ترجمه و در دايركتوری bin / قرار می گيرند و فايل های aspx . بر اساس نياز و درخواست ترجمه می شوند .
• Dynamic compilation : اين مدل ترجمه همزمان با عرضه اولين نسخه ASP.NET 2.0 ارائه گرديد و در آن برنامه به همراه تمامی تگ ها و فايل های كد منبع بر روی سرويس دهنده وب بكارگرفته شده و ASP.NET بطور كامل ترجمه را به صورت پويا و on the fly انجام می دهد . ايجاد تغييرات در فايل های حاوی تگ ها و يا فايل های كد منبع به صورت on the fly از مهمترين ويژگی های روش فوق است . در چنين مواردی ، برنامه بطور اتوماتيك و پس از بروز هر گونه تغيير ترجمه می گردد .
با توجه به اين كه ترجمه پويا همزمان با اولين درخواست انجام می شود ، همواره برای پاسخ به اولين درخواست پس از اعمال تغيير در كد مدت زمان بيشتری نسبت به درخواست های بعدی صرف خواهد شد .
• Site precompilation : در ASP.NET 2.0 يك مدل جديد برای ترجمه precompilation ارائه شده است كه اجازه می دهد تمامی وب سايت را به باينری ترجمه كرد .
در اين روش می بايست قبل از بكارگيری يك پروژه در ابتدا آن را بطور كامل ترجمه نمود . در اين مدل تمامی فايل های code-behind ، صفحات aspx . ، فايل های Html ، منابع گرافيكی و ساير عناصر موجود در back-end به يك و يا چندين اسمبلی قابل اجراء ترجمه می گردند . مدل فوق ، دارای بالاترين سطح كارآئی و امنيت است ولی امكان تغيير محتويات وب سايت در زمان فعال بودن سايت را نمی دهد . اين مدل ، برای سايت هائی كه فركانس بهنگام سازی آنها اندك است و خواستار امنيت بالائی می باشند مناسب است .
در زمان ايجاد يك وب سايت جديد ، ASP.NET به صورت پيش فرض گزينه Dynamic compilation را انتخاب می نمايد . اين بدان معنی است كه تمامی كد و صفحات به عنوان فايل های حاوی كد و تگ بر روی سيستم فايل سرويس دهنده وب ذخيره می گردند و ASP.NET بطور اتوماتيك آنها را ترجمه خواهد كرد . در چنين مواردی ، پاسخ به اولين درخواست نيازمند صرف زمان بيشتری است تا ASP.NET بتواند تمامی صفحه را ترجمه نمايد .
برای site precompilation ، می بايست از يك ابزار جداگانه با نام aspnet_compiler.exe جهت ترجمه برنامه وب استفاده كرد. كمپايلر فوق در دايركتوری Microsoft .NET Framework قرار دارد و می بايست در ابتدا از آن بر روی ماشين تست و پياده سازی استفاده كرد و در ادامه خروجی را بر روی ماشين عملياتی بكار گرفت .
كمپايلر فوق چندين فايل را در دايركتوری مقصد ايجاد می نمايد . در صورتی كه دقيق تر محتويات يكی از فايل های aspx . را بررسی نمائيم ، مشاهده خواهيم كرد كه فايل فوق حاوی هيچگونه تگ مفيدی نمی باشد و صرفا" شامل اطلاعات زیر است :

 "This is a marker file generated by the precompilation tool, and should not be deleted!"

تمامی كد واقعی و تگ ها به باينری ترجمه و در دايركتوری Bin قرار داده می شوند . پس از اين كار می توان محتويات و ساختار دايركتوری ايجاد شده را بر روی ماشين مقصد بكار گرفت و دايركتوری فوق را به عنوان دايركتوری مجازی پيكربندی تا شرايط اجرای برنامه فراهم گردد .

مفهوم page class در ASP.NET

پس از درخواست يك صفحه ASP.NET از سرويس دهنده و به منظور پاسخ گوئی به كاربران، می بايست در سمت سرويس دهنده پردازش های متعددی صورت پذيرد . كدی كه در سمت سرويس دهنده اجراء می گردد منحصرا" كدی نيست كه توسط پياده كننده ايجاد شده است . در مقابل ، ASP.NET در زمان اجراء يك و يا چندين كلاس را كه دقيقا" عمليات مورد نظر را انجام خواهد داد توليد و ترجمه می نمايد .
يك صفحه ASP.NET به عنوان يك unit اجراء و شامل عناصر سمت سرويس دهنده موجود در صفحه ( نظير كنترل ها ) و كد مربوط به event-handlers است كه توسط پياده كننده نوشته شده است . پياده كنندگان مجبور نيستند كه صفحات را از قبل به اسمبلی ترجمه نمايند . ASP.NET بطور پويا صفحات را ترجمه و آنها را در اولين مرتبه ای كه توسط يك كاربر درخواست می گردند ، ترجمه می نمايد . در صورتی كه در صفحه و ساير منابع مربوط به آن تغييراتی ايجاد شده باشد ، صفحه بطور اتوماتيك مجددا" ترجمه می گردد .
كلاس و يا كلاس هائی كه توسط كمپايلر ايجاد می گردد به نوع كدينگ ( مدل Inline code و يا code-behind ) بستگی دارد .

مدل Inline code

در اين مدل ، تگ ها و عناصر سمت سرويس دهنده به همراه كد مربوط به event-handler در يك فايل با انشعاب aspx . قرار می گيرد . كمپايلر يك كلاس جديد را كه مشتق شده از كلاس page و يا يك كلاس پايه سفارشی تعريف شده توسط خصلت Inherits دايركتيو Page@ را توليد و ترجمه می نمايد .
مثلا" در صورتی كه دارای يك صفحه وب ASP.NET با نام SamplePage1 در فهرست ريشه برنامه وب باشيم ، يك كلاس جديد با نام ASP.SamplePage1_aspx از كلاس Page مشتق می گردد . برای صفحات موجود در فولدرهای برنامه ، از نام فولدر به عنوان بخشی در نام كلاس توليد شده استفاده می گردد . كلاس توليد شده شامل تعاريف كنترل های موجود در صفحه aspx .، كد های سفارشی و event handlers است .
پس از توليد صفحه ، كلاس ايجاد شده به يك اسمبلی ترجمه و پس از استقرار در application domain ، امكان اجرای آن به منظور توليد خروجی مورد نظر جهت ارسال برای مرورگر فراهم می گردد . در صورتی كه در صفحه تغييراتی داده شود كه بر روی كلاس توليد شده تاثير بگذارد ( نظير افزودن كنترل های جديد و تغيير در كد ) ، كلاس ترجمه شده غيرمعتبر شده و يك كلاس جديد ايجاد می گردد .
شكل 1 ، مدل توارث برای page class در صفحات وب ASP.NET كه از مدل inline code ( يا تك فايل ) استفاده می كنند را نشان می دهد .

صفحات code-Behind

در مدل code-Behind ، تگ های صفحه به همراه عناصر سمت سرويس دهنده ( شامل تعاريف كنترل ها ) در يك فايل aspx . ذخيره می گردند و كد صفحه در يك فايل جداگانه ديگر قرار می گيرد . فايل حاوی كد شامل يك partial class است (تعريف يك كلاس با استفاده از كليد واژه Partial ) . وپژگی فوق اين موضوع را به اثبات می رساند كه فايل فوق صرفا" شامل بخشی از تمام كدی است كه كلاس كامل صفحه را ايجاد می نمايد . در partial class ، كد مورد نياز برنامه كه عمدتا" شامل event handlers است به آن اضافه می گردد ( امكان اضافه كردن متدها و يا خصلت هائی ديگر با توجه اهداف عملياتی يك صفحه نيز وجود دارد ) .
مدل توارث برای صفحات code-behind نسبت به صفحات Inline code از پيچيدگی بيشتری برخوردار است :
• فايل code-Behind شامل يك partial class است كه از كلاس پايه صفحه به ارث می رسد . كلاس پايه صفحه می تواند كلاس Page و يا كلاس ديگری باشد كه از كلاس Page مشتق شده است.
• فايل aspx . شامل يك خصلت Inherits در دايركتيو Page@ است كه به كلاس partial مربوط به code-behind اشاره می نمايد .
• پس از ترجمه صفحه ، ASP.NET يك partial class را بر اساس فايل aspx . ايجاد می نمايد . اين كلاس ، يك partial class از فايل كلاس code-behind است . فايل partial class توليد شده شامل تعاريف كنترل های صفحه است . اين partial class فايل code-behind را قادر می سازد كه به عنوان بخشی از يك كلاس كامل و بدون الزام پياده كنندگان به تعريف صريح كنترل ها استفاده گردد.
• در نهايت ، ASP.NET كلاس ديگری را توليد كه از كلاس توليد شده در مرحله سوم به ارث رسيده است . اين كلاس توليد شده جديد شامل كد مورد نياز برای ايجاد صفحه است . كلاس توليد شده فوق و كلاس code-behind درون يك اسمبلی ترجمه تا پس از اجراء خروجی مورد نياز جهت ارسال برای مرورگر را توليد نمايد .
برای بسياری از علاقه مندان و پياده كنندگان برنامه های وب 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 ترجيح داده می شود چراكه از مشاهده متد توسط ساير كلاس ها پيشگيری به عمل می آيد ) .




نظرات کاربران
ارسال نظر
با تشکر، نظر شما پس از بررسی و تایید در سایت قرار خواهد گرفت.
متاسفانه در برقراری ارتباط خطایی رخ داده. لطفاً دوباره تلاش کنید.
مقالات مرتبط