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

  1. Interroger les Nœuds Enfants : Utilisez LINQ pour filtrer les nœuds indésirables de la collection ChildNodes.
  2. Sélectionner les Nœuds Désirés : Créez une nouvelle collection qui exclut la page d’inscription.
  3. 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’objets SiteMapNode.
  • Liaison : Après filtrage, la collection résultante children est alors définie comme la DataSource pour le Repeater, et DataBind() 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 !