إزالة العقد من SiteMapNodeCollection في ASP.NET

إدارة التنقل في تطبيق ASP.NET الخاص بك أمر حرج لتوفير تجربة مستخدم مثالية. ومع ذلك، قد تكون هناك حالات تحتاج فيها إلى استبعاد صفحات معينة من الظهور في تنقل موقعك، مثل نموذج التسجيل. إذا كنت تستخدم Repeater لإدراج العقد الفرعية لـ SiteMap، قد تتساءل عن كيفية إزالة عقد محددة بشكل فعّال دون التعرض لمشاكل مثل NotSupportedException التي تشير إلى أن المجموعة للقراءة فقط. سيوجهك هذا المدونة من خلال حل لهذه المشكلة.

فهم المشكلة

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

إليك نظرة سريعة على السيناريو:

مثال على الوضع:

  • نوع التحكم: Repeater
  • مصدر البيانات: SiteMapNodeCollection من web.sitemap
  • الهدف: استبعاد صفحة التسجيل (/Registration.aspx) من قائمة الصفحات المعروضة.

التحدي

استخدام طريقة Remove() على SiteMapNodeCollection يؤدي إلى الخطأ التالي:

NotSupportedException: “المجموعة للقراءة فقط”.

الحل

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

الخطوات خطوة بخطوة

  1. استعلام العقد الفرعية: استخدم LINQ لتصفية العقد غير المرغوب فيها من مجموعة ChildNodes.
  2. تحديد العقد المرغوبة: أنشئ مجموعة جديدة تستثني صفحة التسجيل.
  3. ربط المجموعة الجديدة: قم بتعيين DataSource لـ Repeater الخاص بك إلى المجموعة الجديدة.

تنفيذ كود عينة

إليك كود VB.NET الموصى به لتحقيق النتيجة المرغوبة:

Dim children = From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)()
               Where n.Url <> "/Registration.aspx"
               Select n

RepeaterSubordinatePages.DataSource = children
RepeaterSubordinatePages.DataBind() ' تذكر ربط Repeater

تحليل الكود:

  • استعلام: يستخدم الكود استعلام LINQ لتصفية العقد حيث يكون URL مساويًا لـ /Registration.aspx.
  • التحويل: Cast(Of SiteMapNode)() أمر حاسم لأنه يسمح لـ LINQ بالتعرف على المجموعة كمجموعة من كائنات SiteMapNode.
  • الربط: بعد التصفية، يتم تعيين مجموعة children الناتجة كمصدر البيانات لـ Repeater، ثم يتم استدعاء DataBind() لتحديث التحكم.

الخاتمة

من خلال استخدام LINQ لتصفية العقد المحددة من SiteMapNodeCollection، يمكنك تجنب المخاطر المترتبة على محاولة تعديل مجموعة للقراءة فقط. هذه الطريقة لا تحافظ فقط على نظافة وكفاءة الكود الخاص بك، بل تضمن أيضًا أن تنقلك يعرض الصفحات التي تعتبرها ضرورية فقط.

لا تنسَ أن الحفاظ على هيكل تنقل واضح وموجز هو جزء لا يتجزأ من تجربة المستخدم على موقعك. برمجة سعيدة!