خصائص مختلفة للتعامل مع المسارات والروابط

MEXICO (2)

هناك عدة طرق يمكن بها التحكم أكثر بالمسارات والروابط وإضافة قيود وشروط على الروابط مما يجعل نظام المسارات Routing system أكثر فعالية في خدمة روابط الموقع.

التعامل مع عدد متغير من الأقسام في نمط الروابط

ليست كل الروابط لديها نفس العدد من الأقسام بل بالعكس نجد الروابط قد تكون طويلة جدا أو قصيرة جدا أو مابين ذلك. عند تحديد مسار، يمكنك أن تحدد أن إذا احتوى الرابط على عدة أقسام أكثر من التي تم تعريفها في المسار هذه الأقسام الزائدة سيتم اعتبارها جزء من القِسم الأخير من الرابط. يُطلق على هذا
catch-all parameter. مثال:  إذا كان لدينا النمط التالي:

              url: "{controller}/{action}/{*queryString}"

لاحظ أن القسم الأخير يحتوي على (*) وهذا القسم هو الخاص ب Catch-all parameter. إذا كان لدينا controller باسم home  وكان لدينا action method باسم showQueryString (على سبيل المثال) فإن كل هذه الروابط صحيحة وستتطابق مع النمط:

http://localhost:24046/home/showquerystring

http://localhost:24046/home/showquerystring/test

http://localhost:24046/home/showquerystring/test/id/phoneNum

http://localhost:24046/home/showquerystring/sales/reports/2001/layoffs/oldAged/yemen

 

الجدول التالي يوضح الرابط + قيمة ال queryString

6

 

لاحظ في الصورة التالية شكل الرابط في المتصفح وقيمة ال query string:

5

قيمة ال Query string  مفيدة في بعض السيناريوهات والتحاليل وجمع المعلومات.

 

إضافة قيود على المسارات

بعد أن تعرفنا على المسارات وطرق اضافتها وبعض خصائصها لابد لنا من التعرف على الطرق التي يمكن لنا التحكم فيها بشكل أكبر واضافة قيود أو شروط لتناسب سيناريو معين.

تقييد الجزء الخاص بال id ليكون أرقام فقط

يمكن استخدام التعابير القياسية Regular Expressions لاضافة قيود على المسارات مثل أن يكون ال id فقط ارقام. مثال:

routes.MapRoute(

                 "Default", // Route name

                 "{controller}/{action}/{id}", // Route Pattern

                 new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Default values for parameters

                 new { id = @"\d+" } //Restriction for id

                );

 

بعد اضافة هذا القيد عند محاولتك للوصول لأي رابط لايحتوي على حقل id بصيغة رقم فإن نظام المسارات Routing system سيعتبر أن المسار غير موجود وستجد خطأ 404 على الشاشة.

 

تقييد الروابط لقيم محددة

يمكنك أيضا أن تقيد الروابط لقيم محددة فقط. في المثال التالي قيدنا الروابط إلى ال Controllers التي تحتوي على حرف H في بدايتها ول action methods تحت اسمي Index  و contact فقط.

routes.MapRoute(

 "Default", // Route name

 "{controller}/{action}/{id}", // Route Pattern

 new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Default values for parameters

 new { controller = "^H.*", action = "^Index$|^Contact$" } //Restriction for controller and action

);

فعند محاولتك للوصول لأي رابط اسم الكنترولر لايبدأ بحرف H أو إلى action methods غير index  أو contact فأنك ستجد خطأ 404.  

ملاحظة مهمة: عند اضافتك لعدة مسارات يجب أن تكون المسارات مرتبة من حيث الأكثر تحديدا إلى الأقل تحديداً لأن نظام المسارات Routing system سيتعامل مع أول مسار يطابق الرابط. مثلا إذا كان لدينا أكثر من مسار كالتالي:

routes.MapRoute(

                 "Default", // Route name

                 "{controller}/{action}/{id}", // Route Pattern

                 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Default values for parameters

                );

            routes.MapRoute(

                 "Default", // Route name

                 "{controller}/{action}/{id}", // Route Pattern

                 new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Default values for parameters

                 new { controller = "^H.*", action = "^Index$|^Contact$" } //Restriction for controller and action

                );

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

 

بعض السيناريوهات التي لايتم أخذ نظام المسارات بعين الاعتبار

هناك بعض الأوقات التي يتم فيها تجاهل نظام المسارات مثل:

  • وجود ملف فِعلي على السرفر يتطابق مسار الملف مع الرابط المطلوب. لتجنب هذا يمكنك أن تغير قيمة RouteExistingFiles الموجود ضمن كائن RouteCollection إلى true. في هذه الحالة حتى إذا تطابق الرابط المطلوب مع ملف على السرفر سيتم التعامل مع الرابط من قبل ال routing system
  • نظام المسارات غير مفعل على بعض الأنماط. يمكنك استخدام دالة Ignore الموجودة ضمن كلاس RouteCollection لتحديد بعض الأنماط التي سيتم تجاهلها من قبل نظام المسارات. مثلا في النمط التالي سيتم تجاهل كل محاولات الوصول ل action method تحت اسم showQueryString داخل كنترولر يبدأ بحرف H وسيتم إرجاع خطأ 404 للمستخدم

routes.IgnoreRoute(“{controller}/{action}”, new { controller = “^H.*”, action = “^showQueryString$” });//Restriction for controller and action);

 

لقراءة المقالات السابقة:

 

المصدر: