Knoten aus einer SiteMapNodeCollection in ASP.NET entfernen
Das Management der Navigation Ihrer ASP.NET-Anwendung ist entscheidend, um ein optimales Benutzererlebnis zu bieten. Es kann jedoch Situationen geben, in denen Sie bestimmte Seiten von der Navigation Ihrer Website ausschließen möchten, wie zum Beispiel ein Registrierungsformular. Wenn Sie einen Repeater
verwenden, um Kindknoten einer SiteMap
aufzulisten, fragen Sie sich möglicherweise, wie Sie bestimmte Knoten effektiv entfernen können, ohne auf Probleme wie die NotSupportedException
zu stoßen, die anzeigt, dass die Sammlung schreibgeschützt ist. Dieser Blog wird Ihnen eine Lösung für dieses Problem präsentieren.
Das Problem verstehen
In ASP.NET wird die SiteMapNodeCollection
häufig verwendet, um die Struktur der Seiten Ihrer Website darzustellen. Diese Struktur kann besonders hilfreich sein, wenn Daten an ein Steuerelement wie einen Repeater
gebunden werden. Wenn Sie jedoch bestimmte Seiten, wie zum Beispiel ein Registrierungsformular, von Ihrer Navigationsliste ausblenden möchten, kann das bloße Versuchen, sie aus der Sammlung zu entfernen
, zu Fehlern führen, da die SiteMapNodeCollection
schreibgeschützt ist.
Hier ist eine kurze Übersicht über das Szenario:
Beispiel-Situation:
- Steuerungstyp: Repeater
- Datenquelle: SiteMapNodeCollection von
web.sitemap
- Ziel: Die Registrierungsseite (
/Registration.aspx
) aus der Liste der angezeigten Seiten ausschließen.
Die Herausforderung
Die Verwendung der Methode Remove()
auf einer SiteMapNodeCollection
führt zu folgendem Fehler:
NotSupportedException: “Sammlung ist schreibgeschützt”.
Die Lösung
Um bestimmte Knoten effektiv auszuschließen, müssen Sie die ursprüngliche SiteMapNodeCollection
nicht tatsächlich modifizieren. Stattdessen können Sie die Sammlung abfragen und eine neue enumerable erstellen, die nur die Knoten enthält, die Sie anzeigen möchten. So erreichen Sie es mithilfe von LINQ.
Schritt-für-Schritt-Ansatz
- Abfragen der Kindknoten: Verwenden Sie LINQ, um die unerwünschten Knoten aus der
ChildNodes
-Sammlung herauszufiltern. - Die gewünschten Knoten auswählen: Erstellen Sie eine neue Sammlung, die die Registrierungsseite ausschließt.
- Die neue Sammlung binden: Setzen Sie die
DataSource
Ihres Repeaters auf die neue Sammlung.
Beispielcode-Implementierung
Hier ist der empfohlene VB.NET-Code, um das gewünschte Ergebnis zu erzielen:
Dim children = From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)()
Where n.Url <> "/Registration.aspx"
Select n
RepeaterSubordinatePages.DataSource = children
RepeaterSubordinatePages.DataBind() ' Denken Sie daran, den Repeater zu binden
Aufschlüsselung des Codes:
- Abfrage: Der Code verwendet eine LINQ-Abfrage, um die Knoten herauszufiltern, deren URL gleich
/Registration.aspx
ist. - Casting:
Cast(Of SiteMapNode)()
ist entscheidend, da es LINQ ermöglicht, die Sammlung als eine Menge vonSiteMapNode
-Objekten zu erkennen. - Binding: Nach dem Filtern wird die resultierende
children
-Sammlung alsDataSource
für den Repeater gesetzt, undDataBind()
wird aufgerufen, um die Steuerung zu aktualisieren.
Fazit
Durch die Nutzung von LINQ, um spezifische Knoten aus der SiteMapNodeCollection
herauszufiltern, können Sie die Fallstricke vermeiden, die mit dem Versuch verbunden sind, eine schreibgeschützte Sammlung zu modifizieren. Dieser Ansatz hält Ihren Code nicht nur sauber und effizient, sondern sorgt auch dafür, dass Ihre Navigation nur die Seiten anzeigt, die Sie für notwendig erachten.
Vergessen Sie nicht, dass die Aufrechterhaltung einer klaren und präzisen Navigationsstruktur ein integraler Bestandteil des Benutzererlebnisses auf Ihrer Website ist. Viel Spaß beim Coden!