الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مقدمة تعريفيه بـ ASP.Net , الجزء الثانى : MVC Pattern

مثبّت
بدأه Ahmed Moosa في 22 أكتوبر 2011 · 10 رد · 9,757 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

Page Controller Pattern

يمكنك مطالعة الجزء الأول هنـــــــــــــــا

مقدمة

كان فى بداية الأمر, حيث وجود asp (وتسمى ASP Classic ) , يتم خلط الأكواد بعضها ببعض فى صفحة واحدة , ونقصد هنا أكواد Html مع أى كود Script ,أو حتى فى ASP.Net عند إستخدام Inline Code يحدث نفس الأمر .فكانت الحاجة لفصل الأكواد فى أماكن متفرقة , فجاءت فكرة Code-behind , فأصبحت كل صفحة لها ملف كود يجاورها . هذا الملف هو المتحكم فى طريقة إخراج Html للصفحة وكيفية تكوين الصفحة . هذا الإسلوب فى العمل يتبع إسلوب Page Controller Pattern .

فما هو Page Controller Pattern ؟

"هى عملية إنشاء ملف أو Object ليقوم بمعالجة طلب لصفحة واحدة او معالجة حدث داخل هذة الصفحة" .ومن الواضح , أنه نفس التعريف الذى سنعرف به ملف Code-behind .وهذا أمر طبيعى .لإن ملف code-behind تم إنشائه إعتماداً على إسلوب Page Controller . وعليه, فإن Page Controller تقوم بالعمل على صفحة واحدة فقط . فوجب وجود Controller مصاحب لكل صفحة . وهذا هو حال ملف Code-behind. كما ترى فى الشكل المقابل :

1.png

هنا يمثل ملف Page1.aspx.cs (ملف Code-behind ) ملف Page Controller . فهناك Controller لكل صفحة على حده . ووظيفته التحكم فى تركيب الصفحة لعرضها للمستخدم .ونقصد هنا بالتركيب إعداد عناصر الـ HTML التى ستظهر فى الصفحة .

ملحوظة : لعلك رأيت كلمة Pattern , ترتبط بكلمة أخرى فى عالم البرمجيات و هى design . وتعريف Design and Pattern هو :"أساليب وطرق بمعايير محددة يتم إتباعها لتصميم حل لمشكلة برمجية ".بالطبع هناك العديد من الكتب التى صدرت فى الحديث عن Design and Pattern , ولن يكفى التعريف الذى قدمناه .و حيث أنها أساليب وطرق فإن هذة الكتب تتحدث عن تلك الأساليب والطرق .

يشترك ملف Code-behind لصفحة 1 مع نظيره لصفحة 2 و3 وغيرهم فى كثير من الأمور , ولعل أبرزها دورة حياة الصفحة , من إنشاء للصفحة وإعطاء قيم إبتدائية لها وتحميلها وحفظ حالتها وأمور اخرى مما سنراه إن شاء الله عند دراستنا لدورة حياة الصفحة .فكل الصفحات تشترك مع بعضها فى دورة الحياة . أليس من البديهى لمن على دراية بامور الوراثة فى عالم البرمجيات أن يقول , "ولما لا نضع تلك المراحل المشتركة فى Interface أو Class ونستخدم الوراثة" . رأى صواب تماماً , وقام به بالفعل فريق تطوير ASP. Net . فتم إنشاء Base Class بها تعريف تلك المراحل , وعند إنشاء صفحة جديدة , ترث الصفحة الجديدة من هذة الـBase Class ,مع إمكانية التعديل فى هذة المراحل بما يناسب هذة الصفحة .

فكانت Class Page هى الـ Base Class . والتى نجدها فى هذا المسار System.Web.UI,Page . حيث نجد أن كل صفحة (Code-behind ) ترث من System.Web.UI.Page . كما ترى فى الصورة :

2.png

ورجوعاً إلى الدرس السابق أين وجود الـ HttpHandler ؟ ألم نقل أنه المسئول عن معالجة طلب الصفحة وإخراج كود HTML ؟ بلى , قلنا ذلك , إذاً أين هو ؟

تعد هنا Class Page هى HttpHandler . لا عجب , فإن Page ما هى إلا Class تقوم بعمل Implementation لما نعرفه مسبقاً بـ IhttpHandler. فكما ترى فى الشكل التالى :

3.png

هذا ما هو بالفعل موجود , ولكن فى المشاريع الكبيرة , قد نجد انه مازال هناك أمور مشتركة بين صفحات الموقع الواحد , ليس دورة حياة الصفحة فحسب .فماذا سيحدث ؟ . هنا متاح لك أن تقوم بعمل Controller وسيط . أى Class وسيط , على مثل هذا الشكل :

4.png

أذكر يوماً اننى إستخدمت هذة الطريقة , وكان الموقف حينها , أننى أريد أن أعالج نسيان كتابة عنوان للصفحة لأستبدل "Untitled Page " بعنوان دال ذو معنى , وكان ذلك سيطبق على كل الصفحات , فكان حلاً موفقاً . أن أقوم بمعالجة ذلك فى Class وسيط وهى بدورها ستقوم بالعمل مع كل الصفحات . وتم العمل بنجاح .

مشاكل Page Controller Pattern

يصاحب هذا الـ Pattern بعض المشاكل , او دعنا نركز على Classic ASP. Net , فأنت لا تملك التحكم التام فى أكواد HTML . كذلك لاتملك ان تجرى إختباراً دون ان تقوم بإجراء معاينة للمشروع على أرض الواقع .أى أنك لا تستطيع إختبار كود مكتوب فى حدث Button إلا بعد ان تقوم بالضغط على هذا الـButton , وهذا الأمر يمكن ان تنساه عند إستخدام أدوات Unit Testing . فهى تسمح لك بإختبار الكود دون الحاجة إلى أن تقوم بإجراء معاينة أولاً . ولكن المشكلة أن Unit Testing لا تعمل مع ASP . Net .مشكلة اخرى وهى زيادة عدد الملفات المصاحبة لكل صفحة (Code behind ) , مما قد يؤدى إلى وجود بعض الصعوبات فى تقديم يد العون للكود لإجراء إصلاحات عليه . فجاءت لنا ASP. Net MVC .

ASP. Net MVC

تنويه : لن نتاول MVC كدراسة ولكن سنشرح الـ Pattern القائم عليها MVC . وكذلك إساسيات بناء هذة البيئة فقط . ولكن لا تقلق , سأعود إليك بمقدمة تعريفيه لها إن شاء الله smile.gif .

مقدمة :

MVC :إختصاراً لـ Model-View-Controller , ولا تعد إصدار جديداً من Classic ASP. Net , ولكن هى framework قائم بذاته . وتعتبرASP .Net MVC طريقة أخرى واسلوب آخر لتطوير مواقع الإنترنت إعتماداً على ASP. Net ومزاياها الموجودة من قبل . وأخبرت مايكروسوفت عملائها , بأنهما إسلوبين يمكن أن تتبع أحدهما او كلاهما حسب حاجتك والتصميم الذى تراه مناسباً للمشروع الذى تعمل عليه . ملحوظة : framework ,يقصد بها مجموعة من الـمكتبات(Classes ) التى يعاد إستخدامها لإنشاء تطبيقات .

تقوم MVC على Pattern يسمى Front Pattern , وهو يقوم على وجود Controller واحد يخدم اكثر من صفحة(View) . كما هو الحال فى الشكل التالى :

5.png

على الرغم من أن MVC تقوم على Front Pattern إلا أنها فى حد ذاتها هى Pattern ,يقوم على مبدأ الفصل بين اكوادHTML , والتى تعرف بـإسم (View ), وبين الكود المصاحب للصفحة الذى يدير إدارة هذة الصفحة, وردود الأفعال إستجابة للمستخدم والتى يعرف بـإسم (Controller ) . ويشمل الفصل أيضاً , طبقة التعامل مع قواعد البيانات والتى تعرف بـإسم (Model). وعلى هذا فإن MVC تعمل على ثلاث محاور وهما :Model View Controller . كما بالشكل :

6.png

درس خفيف ويتبعه إن شاء الله دروس أخرى . تنتاول التالى :

  • HttpModules
  • HttpHandlers
  • Application Life Cycle
  • Page Life Cycle

وفق الله الجميع , لما فيه الخير .

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 17 يناير 2012 في 16:23

11

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#2

السلام عليكم ورحمة الله وبركاتة

أشكرك أخي أحمد على هذا المقال..

وأنا في أنتظار القادم أن شاء الله.

1

My Latest

Hello Entity Framework Code First

--------------------

#3

السلام عليكم و رحمة الله و بركاته...

شرح رائع يا اخي,,,جزاك الله خيرا,,,

بانتظار المزيد

1

Currently working on ASP.net ..... come Back Soon

#4

جزاكم الله خيرا

#5

السلام عليكم ورحمه الله وبركاته

اخي احمد ان تقول انه لايمكن استخدام الـ Unit Testing مع الـ Page Controller لماذا؟!! شوف الرابط التالي http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx, وقلت انك لا تستطيع اختبار كود زر الا بعد نقر فهل ممكن كيف يمكن فعل هذا في الـ MVC؟!!

.:: Wish to become better and better ::.

#6
VB Helper كتب:

السلام عليكم ورحمه الله وبركاته

اخي احمد ان تقول انه لايمكن استخدام الـ Unit Testing مع الـ Page Controller لماذا؟!! شوف الرابط التالي http://haacked.com/a...psimulator.aspx, وقلت انك لا تستطيع اختبار كود زر الا بعد نقر فهل ممكن كيف يمكن فعل هذا في الـ MVC؟!!

وعليكم السلام ورحمة الله وبركاته وادخلكم فسيح جناته , مرحباً smile.gif .

لماذا Page Controller ؟

سأعطيك إقتباس من تعريف مايكروسوفت لـ Page Controller: وبعدها التعليق على الرابط

اقتباس

Variants

In most cases, the page controller is dependent on the specifics of an HTTP-based Web request. As a result, the page controllercode usually contains references to HTTP headers, query strings, form fields, multipart form requests, and so forth. This makes it very hard to test the controller code outside the Web application framework. The only option is to test the controller by simulating HTTP requests and parsing the results. This type of testing is both time-consuming and error prone

من هذا الكلام (الإقتباس) . نرى أن الإختيار الوحيد هو محاكاة Http Requesوهو (simulating HTTP requests) . ولو عدنا إلى الرابط المرفق لوجدنا إن صاحب المقال (شخص معروف بالطبع ) قد ذكر أن الأمر "HttpSimulator" . وهو المحاكاه التى تحدثنا عنها .

الأمر الثانى : هناك فرق بين Unit Testing و Integrated Testing . والمقال هو من النوع الثانى .إرجع وابحث مرة أخرى فى الأمر .

الأمر الثالث : أنه يمكنك ان تختبر فقط ما يعرف بـ BLL ,DAL , أى بعيد عن aspx , aspx.cs وملفات BLL , DAL تتوافق مع كيفية عمل Unit Testing وهو إختبار Class أو بالأحرى Method وعزلها كوحدة مستقلة عن باقى الكود , وهدف ذلك , هو التاكد من أنها تؤدى عملها كما توقع لها .

اما عن MVC والـ Button

العارف بـ MVC , يعرف ان MVC ككود أو كرد فعل تقوم على Methods . او ما تعرف بـ ActionResult , و بالفعل يكون رد الفعل على Button بتنفيذ Method وهذا ما يتم فى MVC . وبالتالى إذا أردنا أن نختبر كود مرتبط بـ Button , فإننا سنختبر Method وهو المطلوب فى هذة الحالة . وبالفعل نقوم بعمل Instance من الـ Controller ثم ننادى على الـ Method المطلوبة وهذا هو Unit Test .

وفقك الله لما يحب ويرضى .

تم تعديل هذه المشاركة بواسطة Ahmed Moosa في 3 نوفمبر 2011 في 05:42

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#8

جزاك الله كل خير

#9

السلام عليكم ورحمة الله وبركاته

جزاك الله ألف خير أخونا الفاضل أحمد.. وبارك الله فيك على هذا الشرح الأكثر من رائع :)

من المتابعين لبقية الدروس إن شاء الله

وفقك الله لكل خير وسدد خطاك

تحياتي لك

#10

شرح ممتاز

وننتظر منك المزيد :clapping:

مواضيع مشابهة