پس از عرضه 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 ترجيح داده مي شود چراكه از مشاهده متد توسط ساير كلاس ها پيشگيري به عمل مي آيد ) .