Suppression de Nœuds d’une SiteMapNodeCollection dans ASP.NET
Gérer la navigation de votre application ASP.NET est crucial pour offrir une expérience utilisateur optimale. Cependant, il peut y avoir des cas où vous souhaitez exclure certaines pages de l’apparition dans la navigation de votre site, comme un formulaire d’inscription. Si vous utilisez un Repeater
pour lister les nœuds enfants d’une SiteMap
, vous vous demandez peut-être comment supprimer efficacement des nœuds spécifiques sans rencontrer de problèmes comme le NotSupportedException
indiquant que la collection est en lecture seule. Ce blog vous guidera à travers une solution à ce problème.
Comprendre le Problème
Dans ASP.NET, la SiteMapNodeCollection
est souvent utilisée pour représenter la structure des pages de votre site web. Cette structure peut être particulièrement utile lors de la liaison de données à un contrôle comme un Repeater
. Cependant, si vous souhaitez masquer des pages spécifiques, comme un formulaire d’inscription, de votre liste de navigation, essayer simplement de les Remove
de la collection peut entraîner des erreurs car la SiteMapNodeCollection
est en lecture seule.
Voici un aperçu rapide du scénario :
Situation d’Exemple :
- Type de Contrôle : Repeater
- Source de Données : SiteMapNodeCollection à partir de
web.sitemap
- Objectif : Exclure la page d’inscription (
/Registration.aspx
) de la liste des pages affichées.
Le Défi
Utiliser la méthode Remove()
sur une SiteMapNodeCollection
conduit à l’erreur suivante :
NotSupportedException : “Collection is read-only”.
La Solution
Pour exclure efficacement des nœuds spécifiques, vous n’avez en fait pas besoin de modifier la SiteMapNodeCollection
originale. Au lieu de cela, vous pouvez interroger la collection et créer un nouvel énumérable qui ne contient que les nœuds que vous souhaitez afficher. Voici comment procéder en utilisant LINQ.
Approche Étape par Étape
- Interroger les Nœuds Enfants : Utilisez LINQ pour filtrer les nœuds indésirables de la collection
ChildNodes
. - Sélectionner les Nœuds Désirés : Créez une nouvelle collection qui exclut la page d’inscription.
- Lier la Nouvelle Collection : Définissez la
DataSource
de votre Repeater sur la nouvelle collection.
Implémentation de Code Exemple
Voici le code VB.NET recommandé pour obtenir le résultat souhaité :
Dim children = From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)()
Where n.Url <> "/Registration.aspx"
Select n
RepeaterSubordinatePages.DataSource = children
RepeaterSubordinatePages.DataBind() ' N'oubliez pas de lier le Repeater
Décomposition du Code :
- Requête : Le code utilise une requête LINQ pour filtrer les nœuds où l’URL est égale à
/Registration.aspx
. - Casting :
Cast(Of SiteMapNode)()
est crucial car il permet à LINQ de reconnaître la collection comme un ensemble d’objetsSiteMapNode
. - Liaison : Après filtrage, la collection résultante
children
est alors définie comme laDataSource
pour le Repeater, etDataBind()
est appelé pour mettre à jour le contrôle.
Conclusion
En utilisant LINQ pour filtrer des nœuds spécifiques de la SiteMapNodeCollection
, vous pouvez éviter les pièges de la tentative de modification d’une collection en lecture seule. Cette approche non seulement garde votre code propre et efficace, mais assure également que votre navigation n’affiche que les pages que vous jugez nécessaires.
N’oubliez pas, maintenir une structure de navigation claire et concise est un élément intégral de l’expérience utilisateur sur votre site. Bon codage !