У меня есть повторитель, который перечисляет все web.sitemap
дочерние страницы на странице ASP.NET. Его DataSource
это SiteMapNodeCollection
. Но я не хочу, чтобы там отображалась страница моей регистрационной формы.
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
SiteMapNodeCollection.Remove()
Метод бросает
NotSupportedException: «Коллекция доступна только для чтения».
Как я могу удалить узел из коллекции до DataBinding Repeater?
Тебе не нужен CType
Dim children = _
From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
Where n.Url <> "/Registration.aspx" _
Select n
Используя Linq и .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
Без Linq, но с использованием .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 )
Избегайте удаления предметов из коллекций, так как это всегда медленно. Если вы не собираетесь проходить многократно, вам лучше отфильтровать.
Я получил его для работы с кодом ниже:
Dim children = From n In SiteMap.CurrentNode.ChildNodes _
Where CType(n, SiteMapNode).Url <> "/Registration.aspx" _
Select n
RepeaterSubordinatePages.DataSource = children
Есть ли лучший способ, где мне не нужно использовать CType()
?
Кроме того, это устанавливает детей в System.Collections.Generic.IEnumerable(Of Object)
. Есть ли хороший способ вернуть что-то более строгое, например a System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)
или даже лучше System.Web.SiteMapNodeCollection
?