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
- Alt Düğümleri Sorgula: İstenmeyen düğümleri
ChildNodes
koleksiyonundan filtrelemek için LINQ kullanın. - İstenilen Düğümleri Seç: Kayıt sayfasını hariç tutan yeni bir koleksiyon oluşturun.
- 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 birSiteMapNode
nesne kümesi olarak tanımasına olanak tanır. - Bağlama: Filtreleme sonrasında ortaya çıkan
children
koleksiyonu, Repeater içinDataSource
olarak ayarlanır ve denetimi güncellemek üzereDataBind()
ç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!