Partager via


Comment : modifier par programme des nœuds sitemap dans la mémoire

Mise à jour : novembre 2007

Les sites Web utilisent fréquemment des URL dynamiques contenant des informations ajoutées comme des chaînes de requête. Par exemple, le site d'un groupe de discussion ou d'un forum peut inclure des URL statiques qui font référence aux forums ou aux groupes ainsi qu'aux URL dynamiques de chaque publication. L'URL d'une publication peut être au format suivant : https://www.microsoft.com/newsgroups/ShowPost.aspx? ForumID=2&PostID=53

La mise à jour d'un plan de site pour répertorier l'URL de chaque publication n'est pas une approche efficace parce que les nœuds ne peuvent pas être ajoutés par programme à un plan de site. Toutefois, lorsqu'un utilisateur consulte une publication, vous pouvez utiliser le contrôle SiteMapPath pour afficher de nouveau le chemin de navigation sur le nœud racine et ajouter de manière dynamique les chaînes de requête à chaque lien du chemin en identifiant la publication, le forum ou le groupe. Par exemple, votre chemin de navigation à la publication précédente peut se présenter comme suit :

Home > Forum List > Post List

La propriété Url statique du nœud sitemap des publications peut avoir la valeur https://www.microsoft.com/newsgroups/ShowPost.aspx. Mais dans la mémoire, vous pouvez modifier l'URL du contrôle SiteMapPath pour identifier le forum et la publication spécifique.

Vous pouvez modifier les nœuds sitemap en mémoire à l'aide de l'événement SiteMapResolve, comme le décrivent la procédure et l'exemple suivants.

Pour modifier les nœuds sitemap par programme

  1. Dans le code d'une page de formulaires Web, créez une méthode pour gérer l'événement SiteMapResolve. Par exemple, la déclaration suivante crée une méthode appelée ExpandForumPaths.

    private SiteMapNode ExpandForumPaths(Object sender, 
                                         SiteMapResolveEventArgs e)
    
    Private Function ExpandForumPaths(ByVal sender As Object, ByVal e As SiteMapResolveEventArgs) As SiteMapNode
    
  2. Dans votre gestionnaire d'événements, obtenez une référence au nœud actuel et clonez-la. Par exemple, si le nœud est une publication de groupe de discussion, votre code peut se présenter comme suit.

    SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
    SiteMapNode tempNode = currentNode;
    
    Dim currentNode As SiteMapNode = SiteMap.CurrentNode.Clone(True)
    Dim tempNode As SiteMapNode = currentNode
    

    La variable tempNode retourne en mémoire un nœud sitemap qui peut être traversé, en modifiant chaque propriété Url ou d'autres propriétés. La référence contenue dans nodeCopy est conservée séparément parce que la valeur de retour attendue du gestionnaire d'événements est une référence au nœud actuel. Toutefois, la variable tempNode est utilisée pour déplacer de manière récursive la structure de navigation vers le haut.

    Remarque :

    Étant donné que le nœud cloné est distinct de la structure de navigation de site statique, les modifications apportées aux propriétés Url ne sont ni rendues persistantes en mémoire, ni enregistrées sur disque.

  3. Modifiez les propriétés Url du nœud actuel et de son nœud parent pour inclure des informations de chaîne de requête qui répertorient les identificateurs de publication, de forum et de groupe.

    L'exemple de code suivant suppose l'existence de trois méthodes qui obtiennent les identificateurs.

    int forumGroupID = GetMostRecentForumGroupID();
    int forumID = GetMostRecentForumID(forumGroupID);
    int postID = GetMostRecentPostID(forumID);
    
    if (0 != postID)
    {
        tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
    }
    
    if ((null != (tempNode = tempNode.ParentNode)) &&
        (0 != forumID))
    {
        tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
    }
    
    if ((null != (tempNode = tempNode.ParentNode)) &&
        (0 != forumGroupID))
    {
        tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
    }
    
    Dim forumGroupID As Integer = GetMostRecentForumGroupID()
    Dim forumID As Integer = GetMostRecentForumID(forumGroupID)
    Dim postID As Integer = GetMostRecentPostID(forumID)
    
    If Not (0 = postID) Then
        tempNode.Url = tempNode.Url & "?PostID=" & postID.ToString()
    End If
    
    tempNode = tempNode.ParentNode
    If Not (0 = forumID) And Not (Nothing = tempNode) Then
        tempNode.Url = tempNode.Url & "?ForumID=" & forumID.ToString()
    End If
    
    tempNode = tempNode.ParentNode
    If Not (0 = ForumGroupID) And Not (Nothing = tempNode) Then
        tempNode.Url = tempNode.Url & "?ForumGroupID=" & forumGroupID.ToString()
    End If
    
    Remarque :

    Les instructions if permettent de garantir que les chaînes de requête ne sont ajoutées qu'aux nœuds sitemap existants et uniquement si les identificateurs de groupe, de formulaire et de publication sont disponibles.

  4. Retournez le nœud cloné à l'aide de la ligne de code suivante.

    return currentNode;
    
    Return currentNode
    
  5. Enregistrez votre gestionnaire d'événements dans la méthode Page_Load. Par exemple, votre code peut ressembler à l'exemple suivant.

    SiteMap.SiteMapResolve +=
      new SiteMapResolveEventHandler(this.ExpandForumPaths);
    
    AddHandler SiteMap.SiteMapResolve, AddressOf Me.ExpandForumPaths
    
    Remarque :

    L'événement SiteMapResolve est déclenché lorsque le fournisseur sitemap accède à la propriété CurrentNode, par exemple lorsque le contrôle SiteMapPath affiche une structure de navigation.

  6. Ajoutez un contrôle SiteMapPath dans votre page Web Forms pour afficher la structure de navigation. Un contrôle SiteMapPath peut se présenter de la manière suivante :

    <asp:SiteMapPath
    id="SiteMapPath1"
    
    RenderCurrentNodeAsLink="true" />
    
  7. Assurez-vous que la page Web Forms de votre fichier sitemap possède un nœud. Par exemple, si votre page Web Forms se nomme ShowPost.aspx, votre fichier Web.sitemap peut se présenter comme suit.

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap>
      <siteMapNode
        title="Forum Group" 
        description="Forum Group List"
        url="default.aspx">
        <siteMapNode 
          title="Forum" 
          description="Forum List"
          url="ShowForum.aspx">
          <siteMapNode 
            title="Post" 
            description="Post List" 
            url="ShowPost.aspx" />
        </siteMapNode>
      </siteMapNode>
    </siteMap>
    

Exemple

L'exemple de code suivant décrit comment vous pouvez gérer l'événement SiteMapResolve d'une page Web ASP.NET pour modifier les URL cible affichées par le contrôle SiteMapPath. Dans cet exemple, la page actuelle est une page de publication d'un forum électronique en ligne. Pour afficher une navigation de site plus explicite, les URL des nœuds affichés par le contrôle SiteMapPath sont ajoutées aux chaînes de requête en fonction du contexte. Utilisez le code suivant pour afficher le contrôle.

<asp:SiteMapPath
id="SiteMapPath1"

RenderCurrentNodeAsLink="true" />
<asp:SiteMapPath
id="SiteMapPath1"

RenderCurrentNodeAsLink="true" />

Lorsque vous exécutez l'exemple, placez votre curseur sur les liens du contrôle SiteMapPath pour voir comment les URL sont modifiées.

Cet exemple n'ajoute pas les éléments SiteMapNode dans le fichier Web.sitemap. Ce dernier ne peut être modifié que manuellement.

Remarque :

L'accès à la propriété CurrentNode à partir du contrôle SiteMapResolveEventHandler est sécurisé. L'infrastructure de la navigation de site ASP.NET empêche la récurrence infinie dans ce cas.

Cet exemple suppose que vous avez déjà un fichier sitemap valide, et que la page actuelle dispose au moins de trois nœuds dans la structure sitemap. Pour plus d'informations sur la création de plans de sites, consultez Plans de sites ASP.NET.

Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

    ' The ExpandForumPaths method is called to handle
    ' the SiteMapResolve event.
    AddHandler SiteMap.SiteMapResolve, AddressOf Me.ExpandForumPaths

End Sub

Private Function ExpandForumPaths(ByVal sender As Object, ByVal e As SiteMapResolveEventArgs) As SiteMapNode
    ' The current node represents a Post page in a bulletin board forum.
    ' Clone the current node and all of its relevant parents. This
    ' returns a site map node that a developer can then
    ' walk, modifying each node.Url property in turn.
    ' Since the cloned nodes are separate from the underlying
    ' site navigation structure, the fixups that are made do not
    ' effect the overall site navigation structure.
    Dim currentNode As SiteMapNode = SiteMap.CurrentNode.Clone(True)
    Dim tempNode As SiteMapNode = currentNode

    ' Obtain the recent IDs.
    Dim forumGroupID As Integer = GetMostRecentForumGroupID()
    Dim forumID As Integer = GetMostRecentForumID(forumGroupID)
    Dim postID As Integer = GetMostRecentPostID(forumID)

    ' The current node, and its parents, can be modified to include
    ' dynamic querystring information relevant to the currently
    ' executing request.
    If Not (0 = postID) Then
        tempNode.Url = tempNode.Url & "?PostID=" & postID.ToString()
    End If

    tempNode = tempNode.ParentNode
    If Not (0 = forumID) And Not (tempNode Is Nothing) Then
        tempNode.Url = tempNode.Url & "?ForumID=" & forumID.ToString()
    End If

    tempNode = tempNode.ParentNode
    If Not (0 = ForumGroupID) And Not (tempNode Is Nothing) Then
        tempNode.Url = tempNode.Url & "?ForumGroupID=" & forumGroupID.ToString()
    End If

    Return currentNode

End Function



...


' These methods are just placeholders for the example.
' One option is to use the HttpContext or e.Content object
' to obtain the ID.
Private Function GetMostRecentForumGroupID() As Integer
    Return 24
End Function

Private Function GetMostRecentForumID(ByVal forumGroupId As Integer) As Integer
    Return 128
End Function

Private Function GetMostRecentPostID(ByVal forumId As Integer) As Integer
    Return 317424
End Function
private void Page_Load(object sender, EventArgs e)
{
    // The ExpandForumPaths method is called to handle
    // the SiteMapResolve event.
    SiteMap.SiteMapResolve +=
      new SiteMapResolveEventHandler(this.ExpandForumPaths);
}

private SiteMapNode ExpandForumPaths(Object sender, SiteMapResolveEventArgs e)
{
    // The current node represents a Post page in a bulletin board forum.
    // Clone the current node and all of its relevant parents. This
    // returns a site map node that a developer can then
    // walk, modifying each node.Url property in turn.
    // Since the cloned nodes are separate from the underlying
    // site navigation structure, the fixups that are made do not
    // effect the overall site navigation structure.
    SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
    SiteMapNode tempNode = currentNode;

    // Obtain the recent IDs.
    int forumGroupID = GetMostRecentForumGroupID();
    int forumID = GetMostRecentForumID(forumGroupID);
    int postID = GetMostRecentPostID(forumID);

    // The current node, and its parents, can be modified to include
    // dynamic querystring information relevant to the currently
    // executing request.
    if (0 != postID)
    {
        tempNode.Url = tempNode.Url + "?PostID=" + postID.ToString();
    }

    if ((null != (tempNode = tempNode.ParentNode)) &&
        (0 != forumID))
    {
        tempNode.Url = tempNode.Url + "?ForumID=" + forumID.ToString();
    }

    if ((null != (tempNode = tempNode.ParentNode)) &&
        (0 != forumGroupID))
    {
        tempNode.Url = tempNode.Url + "?ForumGroupID=" + forumGroupID.ToString();
    }

    return currentNode;
}


...


// These methods are just placeholders for the example.
// One option is to use the HttpContext or e.Content object
// to obtain the ID.
private int GetMostRecentForumGroupID()
{
    return 24;
}

private int GetMostRecentForumID(int forumGroupId)
{
    return 128;
}

private int GetMostRecentPostID(int forumId)
{
    return 317424;
}

Sécurité

La validation des données transmises est un aspect important de l'utilisation des chaînes de requête et des données de formulaire. ASP.NET offre un ensemble de contrôles de validation fournissant un moyen simple, mais puissant de vérifier les erreurs et, si nécessaire, d'afficher des messages destinés à l'utilisateur. Afin de mettre l'accent sur la tâche de modification des nœuds sitemap, les contrôles de validation n'ont pas été utilisés dans l'exemple précédent. Pour plus d'informations sur l'ajout d'une validation à votre code, consultez Contrôles ASP.NET de validation.

Voir aussi

Concepts

Événements dans les pages maîtres et de contenu ASP.NET

Sécurisation de la navigation de site ASP.NET

Sécurisation de l'accès aux données

Référence

SiteMapResolve

SiteMapNode

SiteMapPath

Context

Autres ressources

Contrôles ASP.NET de validation

Gestion et déclenchement d'événements

Sécurité des applications ASP.NET dans les environnements hébergés