Domanda

Ho un ripetitore che elenca tutti i web.sitemap pagine figlio in una pagina ASP.NET.Suo DataSource è un SiteMapNodeCollection.Ma non voglio che la pagina del mio modulo di registrazione venga visualizzata lì.

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

IL SiteMapNodeCollection.Remove() il metodo lancia a

NotSupportedException:"La raccolta è di sola lettura".

Come posso rimuovere il nodo dalla raccolta prima di eseguire l'associazione dati del ripetitore?

È stato utile?

Soluzione

Non dovresti aver bisogno di CType

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

Altri suggerimenti

Utilizzando Linq e .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 

Senza Linq, ma utilizzando .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 )

Evita di rimuovere elementi dalle raccolte poiché è sempre lento.A meno che tu non debba ripetere più volte, è meglio filtrare.

Sono riuscito a farlo funzionare con il codice seguente:

Dim children = From n In SiteMap.CurrentNode.ChildNodes _
               Where CType(n, SiteMapNode).Url <> "/Registration.aspx" _
               Select n
RepeaterSubordinatePages.DataSource = children

Esiste un modo migliore in cui non devo usare il file CType()?

Inoltre, questo imposta i bambini a System.Collections.Generic.IEnumerable(Of Object).Esiste un buon modo per recuperare qualcosa di più fortemente tipizzato come a System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode) o meglio ancora a System.Web.SiteMapNodeCollection?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top