يسألونك عن: ASP.NET Routing


حول سلسلة "يسألونك عن"
سلسلة "يسألونك عن": عبارة عن مجموعة من المقالات التقنية الرامية إلى شرح بعض المسائل البرمجية التي لم يتناولها القلم العربي

المقدمة:

جرت العادة أن تؤشر عناوين URL إلى ملفات موجودة على السيرڤر، وكل ملف يمكن الوصول إليه عبر عنوان واحد يبرز مساره الفعلي Physical Path في مجلدات السيرڤر، كما يوضح الرابط التالي، الذي يحيل إلى صفحة اسمها Login.aspx:
Http://www.Website.com/Login.aspx
هذا التوجيه المعتمد من طرف نمط Web Forms، كان معتمدا قبل ذلك في Classic ASP، وكذلك في أغلب لغات برمجة الويب، قبل أن يظهر نمط MVC ويأتي معه بطريقة جديدة لتوجيه العناوين، وهي ما يعرف ب URL Routing، فماذا تكون؟ وكيف نستطيع استخدامها في مشاريع ASP.Net؟

في العمق:

بداية، ينبغي أن نعلم أن توجيه العناوين (وهي الترجمة التي سنعتمدها في هذه المقالة للتدليل على Routing) عبارة عن آلية تسمح باعتماد شكل أو عدة أشكال لعناوين URL، ومن ثم تسهيل عملية الوصول إلى محتويات المشروع دون الحاجة إلى التأشير إلى ملف فعلي Physical File وإنما يكون التأشير إلى Action داخل Controller.
في تقنية ASP.Net، نستطيع التحكم في نمط التوجيه Routing Pattern، عبر الذهاب إلى الكلاس RouteConfig الموجودة داخل المجلد App_Start، لكن قبل أن نغوص في أعماق الكود، تعالوا بنا نطالع الخطاطة التالية التي تبين لنا كيف تتم عملية التوجيه:
في الأول يأتي الطلب من المتصفح لعنوان ما، فيقوم محرك التوجيه Routing Engine داخل الويب سيرڤر، بمعالجة الطلب، ومقارنته بالأنماط المسجلة في جدول التوجيه Routing Table، فإن توافق العنوان المطلوب مع أحدها تم إستدعاء Action المطلوبة، وإلا فإنه يتم إرجاع الخطأ 404 دلالة على أن المورد المطلوب غير موجود.
افتراضيا في ASP.NET MVC يتم اعتماد نمط التوجيه التالي:

Http://www.Website.com/Controller/Action/1

بحيث Action تمثل اسم Action، و Controller تمثل اسم Controller، و Id يمثل البرامتر المراد تمريره إلى الصفحة المتوجه إليها، وغالبا ما يكون هذا البرامتر اختياريا حتى لا يتم إلزام بعض Actions التي لا تستعمل برامترات به.
لو دخلنا إلى الكلاس RouteConfig الموجودة داخل المجلد App_Start، سوف نجد بداخلها وظيفة اسمها RegisterRouters تستقبل برامتر اسمه routes من نوع RouteCollection، وهذا هو محتواها:

        public static void RegisterRoutes(RouteCollection routes)

        {

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");



            routes.MapRoute(

                name: "Default",

                url: "{controller}/{action}/{id}",

                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

            );

        }

هذه الوظيفة هي التي تسمح لنا بتعريف أنماط التوجيه، وافتراضيا تحتوي على نمط جاهز، يستقبل عدة برامترات، يظهر منها في الكود أعلاه ما يلي:
  • البرامتر name: من خلاله نعطي لنمط التوجيه اسما، حتى نميزه عن غيره من الأنماط التي نود تعريفها.
  • البرامتر url: من خلاله نحدد شكل نمط التوجيه، وهو هنا بنفس الكيفية التي تحدثنا عنها آنفا.
  • البرامتر default: من خلاله نعطي العناصر الافتراضية الموافقة للنموذج الذي تم تعريفه، بحيث ستتم إحالتنا عند تصفح المشروع إلى الرابط التالي:
Http//www.Website.com/Home/Index
بحيث Home هو اسم Controller الافتراضي المعرف في جدول أنماط التوجيه، و Index هو اسم Action الافتراضي، ولأن id اختياري Optional، فلن يحدث خطأ عند استدعاء الرابط أعلاه.
قبل تعريف نمط التوجيه داخل الوظيفة، ستلاحظون وجود السطر التالي قبلها:


            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

الوظيفة IgnoreRoute دورها هو منع الوصول إلى المسار أو الملف الممرر لها، في هذه الحالة، ستمنع الطلبات التي تريد ملفات بامتداد axd، بالمثل يمكننا منع الوصول إلى ملف معين أو Action ما، كما يلي:

public static void RegisterRoutes(RouteCollection routes)

        {

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");



            routes.IgnoreRoute("Books/Display");



            routes.MapRoute(

                name: "Default",

                url: "{controller}/{action}/{id}",

                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

            );

        }

في المثال أعلاه، لن يستطيع المستخدم الوصول إلى Action المسماة Display والموجودة داخل Controller المسمى Books، لأننا استثنيناها في Routing عبر استدعاء الوظيفة IgnoreRoute.

حتى يكون Routing شغالا لا بد من تسجيله عند انطلاق التطبيق داخل الحدث Application_Start التابع للملف (المخضرم) Global.asax، الذي لو انتقلنا إليه سنجد أنه بالفعل يحتوي مسبقا على السطر التالي الذي يقوم بتسجيل جدول أنماط التوجيه:

RouteConfig.RegisterRoutes(RouteTable.Routes);

داخل الوظيفة RegisterRoutes يمكننا التحكم في شكل عنوان url عبر تغييره من قيمة البرامتر url، وكذلك يمكننا تغيير Action و Controller الافتراضيين من البرامتر default، كما يبين المثال التالي:

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.IgnoreRoute("Books/Display");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Books", action = "List", id = UrlParameter.Optional }
            );
        }

خاتمة

إلى هنا أحبتي في الله، ينتهي الشطر الأول من مقالتنا حول توجيه العناوين في تقنية ASP.Net، نلتقي في المقالة الثانية إن شاء الله لشرح بعض الأمور المتعلقة بالتوجيه دائما، والتي سيكون موضوعها هو تمرير البرامترات بين Actions ودور جدول التوجيه Routing Table في ذلك.
دام لكم البشر والفرح.


هناك 5 تعليقات:

  1. السادة الاعضاء هل هناك دروس او كتب ما يتناول فيها كيفية التعامل مع الوقت لايجاد الفرق بين توقيتين و ايهما اكبر او اقل من الثاني وجزاكم الله كل الخير ...يا ريت يكون سي شارب

    ردحذف
  2. السادة الاعضاء هل هناك دروس او كتب ما يتناول فيها كيفية التعامل مع الوقت لايجاد الفرق بين توقيتين و ايهما اكبر او اقل من الثاني وجزاكم الله كل الخير ...يا ريت يكون سي شارب

    ردحذف
  3. السلام عليكم استاذ خالد محتاج مشروع ASP.NET MVC 5 كامل ب DataBase SQLServer او لو عندك رابط لمشروع اكون شاكر لحضرتك :)

    ردحذف
  4. لدي مشكله هي عدم قابليه الفيجوال بيسك لدي بالارتباط بقاعده البيانات من نوع اكسس وكلما حاولت اختبار العلاق ياتي لي برساله مفادها
    unrecognized database format

    ردحذف
  5. السلام عليكم
    استاذ خالد انا درست الدورة الكاملة الخاصة بلغة السي شارب وكانت دورة رائعة جدا ونشكرك, ولكن توقفت عند الحصة رقم 82 ذات العنوان (82. برمجة قواعد البيانات - جلب البيانات عبر SqlCommand و SqlDataReader) وذلك بسبب وجود فيديوات محذوفة وناقصة هذه الفيديوات من المفترض تكون موجودة قبل الفيديو رقم 82 (من المفترض تكون موجودة بين الفيديو رقم 79 والفيديو رقم 82) .. ولهذا السبب توقفت في الدورة ... المرجو منك استاذ خالد ان تزودنا بهذه الفيديوات وذلك لكي يتسنى لنا اكمال الدورة ... والسلام عليكم ورحمة الله وبركاته ودام لك البشر والفرح.... اخوك من العراق

    ردحذف