Skip to content

3. مقدمة في تطوير الويب ASP.NET

3.1. Introduction

عرض الفصل السابق مبادئ تطوير الويب التي لا تعتمد على لغة البرمجة المستخدمة. حالياً، تهيمن ثلاث تقنيات على سوق تطوير الويب:

  • J2EE وهي منصة تطوير Java. بالاقتران مع تقنية Struts، المثبتة على خوادم تطبيقات مختلفة، تُستخدم منصة J2EE بشكل أساسي في المشاريع الكبيرة. ونظرًا للغة المستخدمة - Java - يمكن لتطبيق J2EE أن يعمل على أنظمة التشغيل الرئيسية (Windows، Unix، Linux، Mac OS، ...)
  • PHP وهي لغة مفسرة أيضًا مستقلة عن نظام التشغيل. على عكس Java، فهي ليست لغة موجهة للكائنات. ومع ذلك، من المتوقع أن تدخل النسخة PHP5 الكائنات إلى اللغة. وبفضل سهولة الوصول إليها، تُستخدم PHP على نطاق واسع في المشاريع الصغيرة والمتوسطة.
  • ASP.NET، وهي تقنية تعمل فقط على أجهزة Windows المزودة بمنصة .NET (XP، 2000، 2003، ...). يمكن أن تكون لغة التطوير المستخدمة أي لغة متوافقة مع .NET، c.a.d. أكثر من عشرة لغات، بدءًا من لغات Microsoft (C#، VB.NET، J#)، وDelphi من Borland، وPerl، وPython، ...

قدم الفصل السابق أمثلة موجزة لكل من هذه التقنيات الثلاث. يركز هذا المستند على تطوير الويب باستخدام لغة ASP.NET. نفترض أن هذه اللغة معروفة. هذه النقطة مهمة. نحن لا نهتم هنا إلا باستخدامها في سياق تطوير الويب. لنوضح هذه النقطة أكثر بالحديث عن منهجية تطوير الويب MVC.

سيتم تصميم تطبيق ويب يتوافق مع نموذج MVC بالطريقة التالية:

Image

تسعى هذه البنية، التي تسمى بنية ثلاثية الأطراف أو ثلاثية المستويات، إلى الالتزام بنموذج MVC (Model View Controller):

  • واجهة المستخدم هي V (العرض)
  • منطق التطبيق هو C (وحدة التحكم)
  • مصادر البيانات هي M (النموذج)

غالبًا ما تكون واجهة المستخدم عبارة عن متصفح ويب، ولكنها قد تكون أيضًا تطبيقًا مستقلًا يرسل طلبات عبر الشبكة إلى خدمة الويب ويقوم بتنسيق النتائج التي ترسلها إليه. تتكون منطقية التطبيق من البرامج النصية التي تعالج طلبات المستخدم. غالبًا ما تكون مصدر البيانات قاعدة بيانات، ولكنها قد تكون أيضًا ملفات نصية بسيطة، أو دليل LDAP، أو خدمة ويب بعيدة،... من مصلحة المطور الحفاظ على استقلالية كبيرة بين هذه الكيانات الثلاثة بحيث إذا تغير أحدها، لا يتعين على الاثنين الآخرين التغيير أو يتغيران قليلاً.

  • سنضع منطق العمل الخاص بالتطبيق في فئات منفصلة عن الفئة التي تتحكم في حوار الطلب والاستجابة. وبالتالي، يمكن أن يتكون الكتلة [Logique applicative] أعلاه من العناصر التالية:

Image

في الكتلة [Logique Applicative]، يمكننا التمييز بين

  • فئة التحكم التي تمثل بوابة الدخول إلى التطبيق.
  • الكتلة [Classes métier] التي تضم الفئات اللازمة لمنطق التطبيق. وهي مستقلة عن العميل.
  • الكتلة [Classes d'accès aux données] التي تضم الفئات اللازمة للحصول على البيانات المطلوبة للخدمة الصغيرة (servlet)، وغالبًا ما تكون بيانات دائمة (BD، الملفات، الخدمة WEB، ...)
  • كتلة الصفحات ASP التي تشكل طرق عرض التطبيق.

في الحالات البسيطة، غالبًا ما تقتصر منطقية التطبيق على فئتين:

  • فئة وحدة التحكم التي تضمن الحوار بين العميل والخادم: معالجة الطلب، وإنشاء الردود المختلفة
  • فئة الأعمال التي تتلقى من وحدة التحكم البيانات المطلوب معالجتها وتزودها بالنتائج في المقابل. ثم تدير فئة الأعمال هذه بنفسها الوصول إلى البيانات الدائمة.

تكمن خصوصية تطوير الويب في كتابة فئة التحكم وصفحات العرض. فئات الأعمال والوصول إلى البيانات هي فئات .NET تقليدية يمكن استخدامها في تطبيق ويب أو في تطبيق ويندوز أو حتى في تطبيق من نوع وحدة التحكم. تتطلب كتابة هذه الفئات معرفة جيدة بالبرمجة الكائنية. في هذا المستند، سيتم كتابتها بلغة VB.NET، لذا نفترض أن هذه اللغة مفهومة جيدًا. من هذا المنظور، لا داعي للتوسع أكثر من اللازم في شفرة الوصول إلى البيانات. في معظم الكتب التي تتناول لغة ASP.NET، يخصص فصل كامل للغة ADO.NET. يوضح المخطط أعلاه أن الوصول إلى البيانات يتم من خلال فئات .NET تقليدية تمامًا لا تعلم أنها تُستخدم في سياق الويب. لا يتعين على وحدة التحكم، التي تعتبر قائد فريق تطبيق الويب، أن تقلق بشأن ADO.NET. يجب أن يعرف ببساطة الفئة التي يجب أن يطلب منها البيانات التي يحتاجها وكيفية طلبها. هذا كل شيء. وضع كود ADO.NET في وحدة التحكم لا يتوافق مع مفهوم MVC الموضح أعلاه ولن نقوم بذلك.

3.2. الأدوات

هذا المستند مخصص للطلاب، لذا سنعمل باستخدام أدوات مجانية يمكن تنزيلها من الإنترنت:

  • منصة .NET (المترجمات، الوثائق)
  • بيئة التطوير WebMatrix التي تأتي مع خادم الويب Cassini
  • مختلف SGBD (MSDE، MySQL)

يُرجى من القارئ الرجوع إلى الملحق "أدوات الويب" الذي يوضح أين يمكن العثور على هذه الأدوات المختلفة وكيفية تثبيتها. في معظم الأحيان، لن نحتاج سوى إلى ثلاث أدوات:

  • محرر نصوص لكتابة تطبيقات الويب.
  • أداة تطوير VB.NET لكتابة كود VB عندما يكون ذلك ضروريًا. يوفر هذا النوع من الأدوات عمومًا مساعدة في كتابة الكود (الإكمال التلقائي للكود)، والإبلاغ عن الأخطاء النحوية إما فور كتابة الكود أو أثناء تجميعه.
  • خادم ويب لاختبار تطبيقات الويب المكتوبة. سنستخدم Cassini في هذا المستند. يمكن للقارئ الذي يمتلك خادم IIS استبدال Cassini بـ IIS. كلاهما متوافقان مع .NET. ومع ذلك، فإن Cassini محدود في الاستجابة للطلبات المحلية (localhost) فقط، في حين أن IIS يمكنه الاستجابة لطلبات الأجهزة الخارجية.

يعد Visual Studio.NET من Microsoft بيئة تجارية ممتازة للتطوير باستخدام VB.NET. يتيح هذا البرنامج الغني جدًا إدارة جميع أنواع المستندات (كود IDE، مستندات VB.NET، HTML، XML، أوراق الأنماط، ...). بالنسبة لكتابة الكود، يقدم هذه الأداة مساعدة قيّمة من خلال "إكمال" الكود تلقائيًا. ومع ذلك، فإن هذه الأداة التي تحسّن بشكل ملحوظ إنتاجية المطور تعاني من عيب يوازي مزاياها: فهي تحصر المطور في نمط تطوير قياسي فعال بالتأكيد ولكنه ليس مناسبًا دائمًا.

من الممكن استخدام خادم Cassini خارج [WebMatrix] وهذا ما سنفعله غالبًا. يوجد الملف القابل للتنفيذ للخادم في <WebMatrix>\<version>\WebServer.exe حيث <WebMatrix> هو دليل تثبيت [WebMatrix] و<version> هو رقم إصداره:

Image

لنفتح نافذة DOS وننتقل إلى مجلد خادم Cassini:

E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>dir
...
29/05/2003  11:00               53 248 WebServer.exe
...

دعونا نطلق [WebServer.exe] بدون معلمات:

E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>webserver

Image

تشير اللوحة أعلاه إلى أن التطبيق [WebServer/Cassini] يقبل ثلاثة معلمات:

  • /port: رقم منفذ خدمة الويب. يمكن أن يكون أي رقم. القيمة الافتراضية هي 80
  • /path: المسار الفعلي لمجلد على القرص
  • /vpath: المجلد الافتراضي المرتبط بالمجلد الفعلي السابق.

سنضع أمثلةنا في شجرة ملفات جذرها P مع مجلدات chap1 و chap2 و... للفصول المختلفة في هذا المستند. سنربط بهذا المجلد الفعلي P المسار الافتراضي V. كما سنقوم بتشغيل Cassini باستخدام الأمر التالي في نظام التشغيل DOS:

dos> WebServer /port:80 /path:P vpath:V

على سبيل المثال، إذا أردنا أن تكون الجذر الفعلي للخادم هو المجلد [D:\data\devel\aspnet\poly] وجذره الافتراضي [aspnet]، فسيكون أمر DOS لتشغيل خادم الويب هو:

dos> WebServer /port:80 /path:D:\data\devel\aspnet\poly vpath:/aspnet

يمكن وضع هذا الأمر في اختصار. بمجرد تشغيله، يقوم Cassini بتثبيت أيقونة في شريط المهام. بالنقر المزدوج عليها، يمكن الوصول إلى لوحة إيقاف/تشغيل الخادم:

Image

تُظهر اللوحة المعلمات الثلاثة التي تم تشغيلها بها. وتوفر زرين للتشغيل/الإيقاف بالإضافة إلى رابط اختباري إلى جذر شجرة الويب الخاصة بها. نضغط عليه. يتم فتح متصفح ويتم طلب URL [http://localhost/aspnet]. نحصل على محتوى المجلد المشار إليه في الحقل [Physical Path] أعلاه:

Image

في المثال، يمثل URL المطلوب مجلدًا وليس مستند ويب، لذا عرض الخادم محتوى هذا المجلد وليس مستند ويب معينًا. إذا كان يوجد في هذا المجلد ملف باسم [default.aspx]، فسيتم عرضه. لنقم على سبيل المثال بإنشاء الملف التالي ووضعه في جذر شجرة الويب الخاصة بـ Cassini (d:\data\devel\aspnet\poly هنا):

<html>
    <head>
        <title>Page d'entrée</title>
    </head>
    <body>
    Page d'index...
    </body>
</html>
dos>dir d:\data\devel\aspnet\poly\default.aspx
23/03/2004  18:21                  107 default.aspx

لنطلب الآن URL [http://localhost/aspnet] باستخدام متصفح:

Image

نرى أنه في الواقع تم عرض URL [http://localhost/aspnet/default.aspx]. في بقية الوثيقة، سنوضح كيفية تكوين Cassini باستخدام الترميز Cassini(path,vpath) حيث [path] هو اسم المجلد الجذر لشجرة الويب الخاصة بالخادم و [vpath] هو المسار الافتراضي المرتبط به. تجدر الإشارة إلى أنه مع خادم Cassini(path,vpath)، فإن عنوان url [http://localhost/vpath/XX] يتوافق مع المسار الفعلي [path\XX]. سنضع جميع مستنداتنا تحت جذر فعلي سنسميه <webroot>. وبذلك يمكننا الإشارة إلى الملف <webroot>\chap2\here1.aspx. بالنسبة لكل قارئ، ستكون هذه الجذر <webroot> مجلدًا على جهازه الشخصي. هنا ستُظهر لقطات الشاشة أن هذا المجلد غالبًا ما يكون [d:\data\devel\aspnet\poly]. لكن لن يكون هذا هو الحال دائمًا، حيث أُجريت الاختبارات على أجهزة مختلفة.

3.3. الأمثلة الأولى

سنقدم أمثلة بسيطة لصفحة ويب ديناميكية تم إنشاؤها باستخدام VB.NET. ندعو القارئ إلى اختبارها للتحقق من أن بيئة التطوير الخاصة به مثبتة بشكل صحيح. سنكتشف أن هناك عدة طرق لإنشاء صفحة ASP.NET. سنختار واحدة منها لمواصلة عمليات التطوير.

3.3.1. مثال أساسي - البديل 1

الأدوات اللازمة: محرر نصوص، خادم الويب Cassini

نستأنف المثال الوارد في الفصل السابق. نقوم بإنشاء الملف [heure1.aspx] التالي:

<html>
  <head>
      <title>Demo asp.net </title>
  </head>
  <body>
      Il est <% =Date.Now.ToString("T") %>
  </body>
</html>

هذا الرمز هو رمز HTML مع علامة خاصة <% ... %>. داخل هذه العلامة، يمكن وضع رمز VB.NET. هنا الرمز

Date.Now.ToString("T")

سلسلة أحرف C تمثل الوقت الحالي. ثم يتم استبدال العلامة <% ... %> بهذه السلسلة من أحرف C. وبالتالي، إذا كانت C هي السلسلة 18:11:01، فإن السطر HTML الذي يحتوي على الرمز VB.NET يصبح:

      Il est 18:11:01

لنضع الرمز السابق في الملف [<webroot>\chap2\heure1.aspx]. لنقم بتشغيل Cassini(<webroot>,/aspnet) ونطلب باستخدام متصفح URL [http://localhost/aspnet/chap2/heure1.aspx]:

Image

بمجرد الحصول على هذه النتيجة، نعلم أن بيئة التطوير قد تم تثبيتها بشكل صحيح. تم تجميع الصفحة [heure1.aspx] لأنها تحتوي على كود VB.NET. أدى تجميعها إلى إنشاء ملف dll تم تخزينه في مجلد النظام ثم تم تنفيذه بواسطة خادم Cassini.

3.3.2. مثال أساسي - البديل 2

الأدوات اللازمة: محرر نصوص، خادم الويب Cassini

يخلط المستند [heure1.aspx] بين كود HTML وكود VB.NET. في مثال بسيط كهذا، لا يمثل ذلك مشكلة. إذا اضطررنا إلى تضمين المزيد من كود VB.NET، فسنرغب في فصل كود HTML عن كود VB بشكل أكبر. ويمكن القيام بذلك عن طريق تجميع الكود VB داخل علامة <script>:

<script runat="server">
     ' حساب البيانات المراد عرضها بواسطة الكود HTML
...
</script>
<html>
....
' عرض القيم المحسوبة بواسطة جزء البرنامج النصي
</html>

يوضح المثال [heure2.aspx] هذه الطريقة:

<script runat="server">
    Dim maintenant as String=Date.Now.ToString("T")
</script>
<html>
    <head>
        <title>Demo asp.net </title>
    </head>
    <body>
        Il est
        <% =maintenant %>
    </body>
</html>

نضع المستند [heure2.aspx] في شجرة [<webroot>\chap2\heure2.aspx] لخادم الويب Cassini (<webroot>,/aspnet) ونطلب المستند باستخدام متصفح:

Image

3.3.3. مثال أساسي - البديل 3

الأدوات اللازمة: محرر نصوص، خادم الويب Cassini

نواصل عملية فصل الرمز VB عن الرمز HTML بوضعهما في ملفين منفصلين. سيكون الرمز HTML في المستند [heure3.aspx] والرمز VB في [heure3.aspx.vb]. سيكون محتوى [heure3.aspx] كما يلي:


<%@ Page Language="vb" src="heure3.aspx.vb" Inherits="heure3" %>
<html>
    <head>
        <title>Demo asp.net</title>
    </head>
    <body>
        Il est
        <% =maintenant %>
    </body>
</html>

هناك اختلافان أساسيان:

  • التوجيه [Page] مع سمات لا تزال مجهولة
  • استخدام المتغير [maintenant] في الكود HTML في حين أنه لم يتم تهيئته في أي مكان

يستخدم التوجيه [Page] هنا للإشارة إلى أن الكود VB الذي سيقوم بتهيئة الصفحة موجود في ملف آخر. والسمة [src] هي التي تشير إلى هذا الأخير. سنكتشف أن الكود VB هو كود فئة تسمى [heure3]. وبطريقة شفافة بالنسبة للمطور، يتم تحويل ملف .aspx إلى فئة مشتقة من فئة أساسية تسمى [Page]. هنا، يجب أن تنحدر وثيقتنا HTML من الفئة التي تحدد وتحسب البيانات التي يجب عرضها. وهنا هي الفئة [heure3] المحددة في الملف [heure3.aspx.vb]. كما يجب الإشارة إلى هذا الارتباط بين المستند VB [heure3.aspx.vb] والمستند HTML [heure3.aspx]. السمة [inherits] هي التي تحدد هذا الارتباط. يجب أن تشير إلى اسم الفئة المحددة في الملف الذي تشير إليه السمة [src].

لندرس الآن الرمز VB من الصفحة:

Public Class heure3
    Inherits System.Web.UI.Page

     ' بيانات صفحة الويب المراد عرضها
    Protected maintenant As String

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         'يتم حساب بيانات صفحة الويب
        maintenant = Date.Now.ToString("T")
    End Sub
End Class

يجب ملاحظة النقاط التالية:

  • يحدد الرمز VB فئة [heure3] مشتقة من الفئة [System.Web.UI.Page]. وهذا هو الحال دائمًا، حيث يجب أن تكون صفحة الويب مشتقة دائمًا من [System.Web.UI.Page].
  • تعلن الفئة سمة محمية (protected) [maintenant]. من المعروف أن السمة المحمية يمكن الوصول إليها مباشرة في الفئات المشتقة. وهذا ما يسمح للوثيقة HTML [heure3.aspx] بالوصول إلى قيمة البيانات [maintenant] في كودها.
  • تتم تهيئة السمة [maintenant] في إجراء [Page_Load]. سنرى لاحقًا أن كائنًا من النوع [Page] يتم إخطاره من قبل خادم الويب بعدد من الأحداث. يحدث الحدث [Load] عند إنشاء الكائن [Page] ومكوناته. يتم تعيين مدير هذا الحدث بواسطة التوجيه [Handles MyBase.Load]
    Private Sub XX(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  • يمكن أن يكون اسم [XX] لمدير الحدث أي اسم. يجب أن تكون توقيعه هو التوقيع الموضح أعلاه. لن نشرح هذا التوقيع في الوقت الحالي.
  • غالبًا ما يتم استخدام معالج الحدث [Page.Load] لحساب قيم البيانات الديناميكية التي يجب أن تعرضها صفحة الويب.

يتم وضع المستندين [heure3.spx] و [heure3.aspx.vb] في [<webroot>\chap2]. ثم باستخدام متصفح، يتم طلب URL [http://localhost/aspnet/chap2/heure3.aspx] من خادم الويب (<webroot>,/aspnet):

Image

3.3.4. مثال أساسي - البديل 4

الأدوات اللازمة: محرر نصوص، خادم الويب Cassini

نحتفظ بنفس المثال السابق ولكننا نجمع مرة أخرى كل الكود في ملف واحد [heure4.aspx]:

<script runat="server">
     ' بيانات صفحة الويب المراد عرضها
    Private maintenant As String

     ' evt page_load
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         'يتم حساب بيانات صفحة الويب
        maintenant = Date.Now.ToString("T")
    End Sub
</script>

<html>
    <head>
        <title>Demo asp.net</title>
    </head>
    <body>
        Il est
        <% =maintenant %>
    </body>
</html>

نجد تسلسل المثال 2:

<script runat="server">
.... code VB
</script>

<html>
... code HTML
</html>

هذه المرة، تم تنظيم الكود VB في إجراءات. نجد الإجراء [Page_Load] من المثال السابق. نريد أن نوضح هنا أن صفحة .aspx بمفردها (غير مرتبطة برمز VB في ملف منفصل) يتم تحويلها ضمناً إلى فئة مشتقة من [Page]. وبالتالي يمكننا استخدام سمات وأساليب وأحداث هذه الفئة. وهذا ما يتم هنا حيث نستخدم الحدث [Load] لهذه الفئة.

طريقة الاختبار مطابقة للطرق السابقة:

Image

3.3.5. مثال أساسي - البديل 5

الأدوات المطلوبة: محرر نصوص، وخادم الويب Cassini

كما في المثال 3، يتم فصل الكود VB والكود HTML في ملفين منفصلين. يتم وضع الكود VB في [heure5.aspx.vb]:

Public Class heure5
    Inherits System.Web.UI.Page

     ' بيانات صفحة الويب المراد عرضها
    Protected maintenant As String

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         'يتم حساب بيانات صفحة الويب
        maintenant = Date.Now.ToString("T")
    End Sub
End Class

يتم وضع الرمز HTML في [heure5.aspx]:


<%@ Page Inherits="heure5" %>
<html>
    <head>
        <title>Demo asp.net</title>
    </head>
    <body>
        Il est
        <% =maintenant %>
    </body>
</html>

هذه المرة، لم تعد التوجيهية [Page] تشير إلى الارتباط بين الرمز HTML والرمز VB. لم يعد بإمكان خادم الويب العثور على الرمز VB لتجميعه (غياب السمة src). يقع على عاتقنا إجراء هذا التجميع. في نافذة DOS، نقوم بتجميع الفئة VB [heure5.aspx.vb]:

dos>dir
23/03/2004  18:34                  133 heure1.aspx
24/03/2004  09:47                  232 heure2.aspx
24/03/2004  10:16                  183 heure3.aspx
24/03/2004  10:16                  332 heure3.aspx.vb
24/03/2004  14:31                  440 heure4.aspx
24/03/2004  14:45                  332 heure5.aspx.vb
24/03/2004  14:56                  148 heure5.aspx
dos>vbc /r:system.dll /r:system.web.dll /t:library /out:heure5.dll heure5.aspx.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
dos>dir heure5.dll
24/03/2004  14:51                3 072 heure5.dll

أعلاه، كان الملف القابل للتنفيذ [vbc.exe] الخاص بالمترجم موجودًا في PATH الخاص بجهاز Dos. وإذا لم يكن كذلك، لكان من الضروري تحديد المسار الكامل لملف [vbc.exe] الموجود في شجرة المجلد الذي تم تثبيت SDK.NET فيه. تتطلب الفئات المشتقة من [Page] موارد موجودة في DLL و [system.dll, system.web.dll]، ومن هنا تأتي الإشارة إليهما عبر الخيار /r للمترجم. الخيار /t :library موجود للإشارة إلى أننا نريد إنتاج ملف DLL. الخيار /out يشير إلى اسم الملف المراد إنتاجه، وهو هنا [heure5.dll]. يحتوي هذا الملف على الفئة [heure5] التي يحتاجها مستند الويب [heure5.aspx]. لكن خادم الويب يبحث عن ملفات DLL التي يحتاجها في مواقع محددة بدقة. أحد هذه المواقع هو المجلد [bin] الموجود في جذر شجرته. هذا الجذر هو ما أطلقنا عليه <webroot>. بالنسبة لخادم IIS، يكون عادةً <محرك الأقراص>:\inetpub\wwwroot حيث <محرك الأقراص> هو محرك الأقراص (C، D، ...) الذي تم تثبيت IIS عليه. بالنسبة لخادم Cassini، تتوافق هذه الجذر مع المعلمة /path التي استخدمتها لتشغيله. تذكر أنه يمكن الحصول على هذه القيمة بالنقر المزدوج على أيقونة الخادم في شريط المهام:

Image

<webroot> يتوافق مع السمة [Physical Path] أعلاه. لذلك نقوم بإنشاء مجلد <webroot>\bin ونضع [heure5.dll] بداخله:

Image

نحن جاهزون. نطلب URL [http://localhost/aspnet/chap2/heure5.aspx] من خادم Cassini (<webroot>,/aspnet):

Image

3.3.6. مثال أساسي - البديل 6

الأدوات اللازمة: محرر نصوص، خادم الويب Cassini

لقد أوضحنا حتى الآن أن تطبيق الويب الديناميكي يتكون من مكونين:

  1. كود VB لحساب الأجزاء الديناميكية من الصفحة
  2. كود HTML الذي يتضمن أحيانًا كود VB لعرض هذه القيم في الصفحة. يمثل هذا الجزء الاستجابة التي يتم إرسالها إلى عميل الويب.

يُطلق على المكون 1 اسم مكون التحكم في الصفحة، ويُطلق على الجزء 2 اسم مكون العرض. يجب أن يحتوي جزء العرض على أقل قدر ممكن من كود VB، بل وربما لا يحتوي على كود VB على الإطلاق. سنرى أن هذا ممكن. هنا، نعرض مثالاً لا يوجد فيه سوى وحدة تحكم واحدة ولا توجد مكونة عرض. وحدة التحكم هي التي تولد بنفسها الاستجابة للعميل دون مساعدة من مكونة العرض.

يصبح كود العرض كما يلي:

 <%@ Page src="heure6.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="heure6" %>

نرى أنه لم يعد هناك أي كود HTML بداخله. يتم إعداد الاستجابة مباشرة في وحدة التحكم:

Public Class heure6
    Inherits System.Web.UI.Page

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         ' يتم إعداد الرد
        Dim HTML As String
        HTML = "<html><head><title>heure6</title></head><body>Il est "
        HTML += Date.Now.ToString("T")
        HTML += "</body></html>"
         ' إرسالها
        Response.Write(HTML)
    End Sub
End Class

يقوم المتحكم هنا بإنشاء الرد بالكامل بدلاً من الأجزاء الديناميكية منه فقط. بالإضافة إلى ذلك، يقوم بإرساله. ويقوم بذلك باستخدام الخاصية [Response] من النوع [HttpResponse] من الفئة [Page]. وهو كائن يمثل الاستجابة التي يقدمها الخادم للعميل. تحتوي الفئة [HttpResponse] على طريقة [Write] للكتابة في التدفق HTML الذي سيتم إرساله إلى العميل. هنا، نضع كامل تدفق HTML المراد إرساله في المتغير [HTML] ونرسل هذا المتغير إلى العميل عبر [Response.Write(HTML)].

نطلب عنوان URL [http://localhost/aspnet/chap2/heure6.aspx] من خادم Cassini (<webroot>,/aspnet):

Image

3.3.7. خاتمة

بعد ذلك، سنستخدم الطريقة 3 التي تضع الرمز VB والرمز HTML من مستند ويب ديناميكي في ملفين منفصلين. تتميز هذه الطريقة بتقسيم صفحة الويب إلى مكونين:

  1. مكون تحكم يتكون فقط من الرمز VB لحساب الأجزاء الديناميكية من الصفحة
  2. مكون العرض وهو الاستجابة المرسلة إلى العميل. ويتكون من كود HTML الذي يتضمن أحيانًا كود VB لعرض القيم الديناميكية. سنسعى دائمًا إلى الحصول على الحد الأدنى من رمز VB في جزء العرض، والأمثل هو عدم وجوده على الإطلاق.

كما أوضحت الطريقة 5، يمكن ترجمة وحدة التحكم بشكل مستقل عن تطبيق الويب. ويتمثل ميزة ذلك في التركيز على الكود فقط والحصول على قائمة بجميع الأخطاء عند كل عملية ترجمة. بمجرد تجميع وحدة التحكم، يمكن اختبار تطبيق الويب. بدون تجميع مسبق، سيقوم خادم الويب بالتجميع، وعندها سيتم الإبلاغ عن الأخطاء واحدة تلو الأخرى. قد يُعتبر هذا الأمر مملًا.

بالنسبة للأمثلة التالية، تكفي الأدوات التالية:

  • محرر نصوص لإنشاء مستندات HTML و VB للتطبيق عندما تكون بسيطة
  • أداة تطوير IDE .NET لإنشاء فئات VB.NET للاستفادة من المساعدة التي تقدمها هذه الأداة في كتابة الكود. ومن أمثلة هذه الأدوات CSharpDevelop (http://www.icsharpcode.net). ويرد مثال على استخدامها في الملحق [Les outils du développement web].
  • أداة WebMatrix لإنشاء صفحات عرض التطبيق (انظر الملحق [Les outils du développement web]).
  • خادم Cassini

جميع هذه الأدوات مجانية.