انواع مدل كدينگ در ASP. NET 2.0
به دليل اهميت اين موضوع بر آن شديم كه در سه مقاله جداگانه با گزينه های موجود برای كدينگ يك صفحه وب آشنا شويم و به چندين پرسش اساسی در اين رابطه پاسخ دهيم . در اولين بخش ، پس از بررسی اجمالی برخی نكات اوليه و مهم كه بيشتر جنبه يادآوری دارد به بررسی انواع مدل كدينگ در ASP.NET 2.0 خواهيم پرداخت .
يادآوری !
ويژوال استوديو ، همچنين ازمدل 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" %> |
كد زير محتويات فايل TestCodeBehind.aspx را نشان می دهد .
روش Inline code : فايل TestInlineCode.aspx |
<%@ Page Language="VB" %> |
روش code-behind : فايل TestCodeBehind.aspx.vb |
Partial Class TestCodeBehind |
جمع بندی
• با اين كه مدل inline code برای صفحات كوچك ، فشرده و مناسب تر به نظر می آيد ولی همزمان با رشد كد و Html برای بسياری از پياده كنندگان راحت تر است كه با دو بخش فوق بطور جداگانه سروكار داشته باشند .
• در مدل code-behind با توجه به اين كه دقيقا" مشخص می گردد كه چه كلاسی ايجاد شده است و از چه namespace استفاده شده است ، شاهد شفافيت بيشتری در كد خواهيم بود.
• در مدل code-behind می توان اين امكان را در اختيار يك طراح وب قرار داد كه صرفا" بخش رابط كاربر را ايجاد و يا تصحيح نمايد ، بدون اين كه لازم باشد وی به كد برنامه دستيابی داشته باشد .
روش های ترجمه در ASP.NET 2.0
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!" |
مفهوم page class در ASP.NET
يك صفحه ASP.NET به عنوان يك unit اجراء و شامل عناصر سمت سرويس دهنده موجود در صفحه ( نظير كنترل ها ) و كد مربوط به event-handlers است كه توسط پياده كننده نوشته شده است . پياده كنندگان مجبور نيستند كه صفحات را از قبل به اسمبلی ترجمه نمايند . ASP.NET بطور پويا صفحات را ترجمه و آنها را در اولين مرتبه ای كه توسط يك كاربر درخواست می گردند ، ترجمه می نمايد . در صورتی كه در صفحه و ساير منابع مربوط به آن تغييراتی ايجاد شده باشد ، صفحه بطور اتوماتيك مجددا" ترجمه می گردد .
كلاس و يا كلاس هائی كه توسط كمپايلر ايجاد می گردد به نوع كدينگ ( مدل Inline code و يا code-behind ) بستگی دارد .
مدل Inline code
مثلا" در صورتی كه دارای يك صفحه وب ASP.NET با نام SamplePage1 در فهرست ريشه برنامه وب باشيم ، يك كلاس جديد با نام ASP.SamplePage1_aspx از كلاس Page مشتق می گردد . برای صفحات موجود در فولدرهای برنامه ، از نام فولدر به عنوان بخشی در نام كلاس توليد شده استفاده می گردد . كلاس توليد شده شامل تعاريف كنترل های موجود در صفحه aspx .، كد های سفارشی و event handlers است .
پس از توليد صفحه ، كلاس ايجاد شده به يك اسمبلی ترجمه و پس از استقرار در application domain ، امكان اجرای آن به منظور توليد خروجی مورد نظر جهت ارسال برای مرورگر فراهم می گردد . در صورتی كه در صفحه تغييراتی داده شود كه بر روی كلاس توليد شده تاثير بگذارد ( نظير افزودن كنترل های جديد و تغيير در كد ) ، كلاس ترجمه شده غيرمعتبر شده و يك كلاس جديد ايجاد می گردد .
شكل 1 ، مدل توارث برای page class در صفحات وب ASP.NET كه از مدل inline code ( يا تك فايل ) استفاده می كنند را نشان می دهد .
صفحات code-Behind
مدل توارث برای صفحات 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 |
با تغيير اندك در زيرساخت ASP. NET ، به سادگی يك صفحه aspx . با فايل كد منبع توسط خصلت CodeFile مرتبط می گردد .
<%@ Page Language="VB" AutoEventWireup="true" CodeFile="TestCodeBehind.aspx.vb" Inherits="TestCodeBehind" %> |
چگونه تگ های كنترل به متغيرهای صفحه مرتبط می گردند ؟
فرض كنيد كه در صفحه aspx . دارای يك كنترل text box به صورت زير باشيم :
<asp:TextBox ID="txtInput" runat="server"/> |
Protected System.Web.UI.TextBox txtInput |
توجه داشته باشيد كه متغيرهای كنترل همواره با كليد واژه قابليت دستيابی پذيری protected تعريف می گردند . علت اين موضوع به روش توارث استفاده شده در ASP.NET ( مدل كدينگ صفحه ) برمی گردد .
روش انجام اين كار به صورت زير است :
• در ابتدا ، page class از كتابخانه كلاس دات نت قابليت های اوليه را تعريف و به يك صفحه وب اجازه می دهد ساير كنترل ها را هاست نمايد و خود را به Html تفسير و امكان دستيابی به اشياء سنتی ASP نظير Request ، Response و Session را فراهم نمايد .
• كلاس code-behind از كلاس صفحه به ارث می رسد تا بتواند توانمندی های اوليه صفحه وب ASP. NET را فراهم نمايد .
• در نهايت ، صفحه aspx . از طريق كلاس صفحه سفارشی از كد استفاده می نمايد . اين موضوع باعث می شود كه صفحه فوق بتواند رابط كاربر را با كدی كه آن را حمايت می نمايد ، تركيب نمايد .
عملكرد متغيرهای protected مشابه متغيرهای private با يك تفاوت اساسی است . اين نوع متغيرها قابل دستيابی برای كلاس های مشتق شده می باشند .به عبارت ديگر ، استفاده از متغيرهای protected در كلاس code-behind اين اطمينان را ايجاد می نمايد كه متغيرها در كلاس صفحه مشتق شده قابل دستيابی باشند . اين موضوع به ASP. NET اجازه می دهد كه متغيرهای كنترل را در زمان اجراء به تگ های كنترل مرتبط نمايد .
چگونه رويدادها به 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"> |