Wie kann ich Knoten aus einer SiteMapNodeCollection entfernen?
Frage
Ich habe einen Repeater, der alles auflistet web.sitemap
untergeordnete Seiten auf einer ASP.NET-Seite.Es ist DataSource
ist ein SiteMapNodeCollection
.Ich möchte jedoch nicht, dass meine Registrierungsformularseite dort angezeigt wird.
Dim Children As SiteMapNodeCollection = SiteMap.CurrentNode.ChildNodes
'remove registration page from collection
For Each n As SiteMapNode In SiteMap.CurrentNode.ChildNodes
If n.Url = "/Registration.aspx" Then
Children.Remove(n)
End If
Next
RepeaterSubordinatePages.DataSource = Children
Der SiteMapNodeCollection.Remove()
Methode wirft a
NotSupportedException:„Sammlung ist schreibgeschützt“.
Wie kann ich den Knoten aus der Sammlung entfernen, bevor ich den Repeater datenbind?
Lösung
Sie sollten CType nicht benötigen
Dim children = _
From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
Where n.Url <> "/Registration.aspx" _
Select n
Andere Tipps
Verwendung von Linq und .Net 3.5:
//this will now be an enumeration, rather than a read only collection
Dim children = SiteMap.CurrentNode.ChildNodes.Where( _
Function (x) x.Url <> "/Registration.aspx" )
RepeaterSubordinatePages.DataSource = children
Ohne Linq, aber mit .Net 2:
Function IsShown( n as SiteMapNode ) as Boolean
Return n.Url <> "/Registration.aspx"
End Function
...
//get a generic list
Dim children as List(Of SiteMapNode) = _
New List(Of SiteMapNode) ( SiteMap.CurrentNode.ChildNodes )
//use the generic list's FindAll method
RepeaterSubordinatePages.DataSource = children.FindAll( IsShown )
Vermeiden Sie das Entfernen von Elementen aus Sammlungen, da dies immer langsam ist.Sofern Sie nicht mehrere Male durchlaufen, ist es besser, zu filtern.
Ich habe es mit dem folgenden Code zum Laufen gebracht:
Dim children = From n In SiteMap.CurrentNode.ChildNodes _
Where CType(n, SiteMapNode).Url <> "/Registration.aspx" _
Select n
RepeaterSubordinatePages.DataSource = children
Gibt es einen besseren Weg, bei dem ich das nicht verwenden muss? CType()
?
Dies setzt auch Kinder zu einem System.Collections.Generic.IEnumerable(Of Object)
.Gibt es eine gute Möglichkeit, etwas stärker Typisiertes wie a zurückzubekommen? System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)
oder noch besser ein System.Web.SiteMapNodeCollection
?