ASP.NET’te SiteMapNodeCollection’dan Düğüm Çıkarmak

ASP.NET uygulamanızın navigasyonunu yönetmek, optimal bir kullanıcı deneyimi sağlamak için çok önemlidir. Ancak, bazı durumlarda, bir kayıt formu gibi, sitenizin navigasyonunda görünmesini istemediğiniz belirli sayfaları dışlamak isteyebilirsiniz. Eğer bir Repeater kullanarak bir SiteMap‘in alt düğümlerini listeliyorsanız, NotSupportedException gibi sorunlarla karşılaşmadan belirli düğümleri nasıl etkili bir şekilde çıkarabileceğinizi merak ediyor olabilirsiniz. Bu blog, bu soruna bir çözüm sunacaktır.

Sorunu Anlamak

ASP.NET’te, SiteMapNodeCollection, web sitenizin sayfa yapısını temsil etmek için sıkça kullanılır. Bu yapı, bir Repeater gibi bir denetimle veri bağlarken özellikle kullanışlıdır. Ancak, kayıt formu gibi belirli sayfaları navigasyon listenizden gizlemek istiyorsanız, koleksiyondan bunları Remove etmeye çalışmak hatalara yol açabilir, çünkü SiteMapNodeCollection salt okunurdur.

İşte duruma hızlı bir genel bakış:

Örnek Durum:

  • Denetim Türü: Repeater
  • Veri Kaynağı: web.sitemap‘ten SiteMapNodeCollection
  • Hedef: Kayıt sayfasını (/Registration.aspx) görüntülenen sayfalar listesinde dışlamak.

Zorluk

SiteMapNodeCollection üzerinde Remove() yöntemini kullanmak aşağıdaki hataya yol açar:

NotSupportedException: “Koleksiyon salt okunurdur”.

Çözüm

Belirli düğümleri etkili bir şekilde dışlamak için aslında orijinal SiteMapNodeCollection‘ı değiştirmeniz gerekmez. Bunun yerine, koleksiyonu sorgulayıp, sadece görüntülemek istediğiniz düğümleri içeren yeni bir enumerable oluşturabilirsiniz. Bunu LINQ kullanarak nasıl başarabileceğinizi görelim.

Adım Adım Yaklaşım

  1. Alt Düğümleri Sorgula: İstenmeyen düğümleri ChildNodes koleksiyonundan filtrelemek için LINQ kullanın.
  2. İstenilen Düğümleri Seç: Kayıt sayfasını hariç tutan yeni bir koleksiyon oluşturun.
  3. Yeni Koleksiyonu Bağlayın: Repeater’ınızın DataSource‘unu yeni koleksiyona ayarlayın.

Örnek Kod Uygulaması

Aşağıda istenen sonuçları elde etmek için önerilen VB.NET kodunu bulabilirsiniz:

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

RepeaterSubordinatePages.DataSource = children
RepeaterSubordinatePages.DataBind() ' Repeater'ı bağlamayı unutmayın

Kodun Analizi:

  • Sorgulama: Kod, URL’si /Registration.aspx olan düğümleri dışlamak için bir LINQ sorgusu kullanır.
  • Casting: Cast(Of SiteMapNode)() önemli bir adımdır, çünkü LINQ’un koleksiyonu bir SiteMapNode nesne kümesi olarak tanımasına olanak tanır.
  • Bağlama: Filtreleme sonrasında ortaya çıkan children koleksiyonu, Repeater için DataSource olarak ayarlanır ve denetimi güncellemek üzere DataBind() çağrılır.

Sonuç

LINQ kullanarak SiteMapNodeCollection‘dan belirli düğümleri filtreleyerek, salt okunur bir koleksiyonu değiştirmeye çalışmanın olumsuz yönlerinden kaçınabilirsiniz. Bu yaklaşım, kodunuzu hem temiz hem de etkili tutmanın yanı sıra, navigasyonunuzun yalnızca gerekli gördüğünüz sayfaları göstermesini sağlar.

Unutmayın, net ve öz bir navigasyon yapısını sürdürmek, sitenizde kullanıcı deneyiminin önemli bir parçasıdır. Mutlu kodlamalar!