Gewusst wie: Programmgesteuertes Ändern von Siteübersichtsknoten im Arbeitsspeicher

Aktualisiert: November 2007

Websites verwenden oft dynamische URLs mit Informationen, die als Abfragezeichenfolgen angehängt werden. Beispielsweise könnte die Site für eine Newsgroup oder ein Forum statische URLs enthalten, die auf Foren oder Gruppen verweisen, daneben aber auch dynamische URLs für die einzelnen Postings. Der URL für ein Posting könnte dann folgendes Format haben: https://www.microsoft.com/newsgroups/ShowPost.aspx? ForumID=2&PostID=53.

Eine Siteübersicht so zu aktualisieren, dass jedes einzelne Posting aufgeführt wird, ist kein effizienter Ansatz, da Knoten einer Siteübersicht nicht programmgesteuert hinzugefügt werden können. Während ein Benutzer ein Posting anzeigt, können Sie jedoch das SiteMapPath-Steuerelement dazu verwenden, den Navigationspfad zurück zum Stammknoten anzuzeigen und jedem Link im Pfad dynamisch eine Abfragezeichenfolge anzuhängen, mit der ein Posting, ein Forum oder eine Gruppe identifiziert wird. Beispielsweise könnte der Navigationspfad zum vorhergehenden Posting folgendermaßen aussehen:

Home > Forum List > Post List

Gehen wir davon aus, dass die statische Url-Eigenschaft des Siteübersichtsknotens für Posts auf https://www.microsoft.com/newsgroups/ShowPost.aspx festgelegt ist. Dennoch können Sie im Arbeitsspeicher den URL im SiteMapPath-Steuerelement ändern, um das Forum und das spezifische Posting zu identifizieren.

Sie können die Siteübersichtsknoten im Arbeitsspeicher ändern, indem Sie das SiteMapResolve-Ereignis verwenden. Dies wird durch die Prozedur im folgenden Beispiel veranschaulicht.

So ändern Sie Siteübersichtsknoten programmgesteuert

  1. Erstellen Sie im Code der Web Forms-Seite eine Methode, die das SiteMapResolve-Ereignis behandelt. Zum Beispiel erstellt die folgende Deklaration eine Methode mit dem Namen ExpandForumPaths.

    private SiteMapNode ExpandForumPaths(Object sender, 
                                         SiteMapResolveEventArgs e)
    
    Private Function ExpandForumPaths(ByVal sender As Object, ByVal e As SiteMapResolveEventArgs) As SiteMapNode
    
  2. Rufen Sie im Ereignishandler einen Verweis auf den aktuellen Knoten ab, und klonen Sie diesen. Wenn es sich bei dem Knoten beispielsweise um ein Newsgroupposting handelt, dann könnte der Code folgendermaßen aussehen:

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

    Die tempNode-Variable gibt einen Siteübersichtsknoten an den Arbeitsspeicher zurück, der durchlaufen werden kann, um jede Url-Eigenschaft oder auch jede andere Eigenschaft zu ändern. Der Verweis in nodeCopy wird separat beibehalten, da der erwartete Rückgabewert des Ereignishandlers ein Verweis auf den aktuellen Knoten ist. Die Variable tempNode dient dazu, in der Navigationsstruktur rekursiv nach oben zu gelangen.

    Hinweis:

    Da der geklonte Knoten von der statischen Sitenavigationsstruktur getrennt ist, werden die Änderungen der Url-Eigenschaften weder im Arbeitsspeicher beibehalten noch auf Festplatte gespeichert.

  3. Ändern Sie die Url-Eigenschaften des aktuellen Knotens und des übergeordneten Knotens, um Abfragenzeichenfolgen mit den Bezeichnern des Postings, des Forums und der Gruppe einzufügen.

    Im folgenden Codebeispiel wird von drei Methoden zur Ermittlung der Bezeichner ausgegangen:

    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
    
    Hinweis:

    Über if-Anweisungen wird sichergestellt, dass nur bestehenden Siteübersichtsknoten Abfragezeichenfolgen hinzugefügt werden, und auch nur dann, wenn die Bezeichner für Gruppe, Forum und Posting verfügbar sind.

  4. Geben Sie den geklonten Knoten zurück, indem Sie die folgende Codezeile verwenden.

    return currentNode;
    
    Return currentNode
    
  5. Registrieren Sie den Ereignishandler in der Page_Load-Methode. Zum Beispiel könnte der Code folgendermaßen aussehen.

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

    Das SiteMapResolve-Ereignis wird ausgelöst, wenn der Siteübersichtsanbieter auf die CurrentNode-Eigenschaft zugreift, z. B. bei der Darstellung einer Navigationsstruktur durch das SiteMapPath-Steuerelement.

  6. Fügen Sie der Web Forms-Seite ein SiteMapPath-Steuerelement hinzu, um die Navigationsstruktur anzuzeigen. Das SiteMapPath-Steuerelement könnte folgendermaßen aussehen.

    <asp:SiteMapPath
    id="SiteMapPath1"
    
    RenderCurrentNodeAsLink="true" />
    
  7. Stellen Sie sicher, dass die Siteübersichtsdatei über einen Knoten für die Web Forms-Seite verfügt. Wenn die Web Forms-Seite ShowPost.aspx heißt, dann könnte die Datei Web.sitemap folgendermaßen aussehen.

    <?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>
    

Beispiel

Das folgende Codebeispiel zeigt, wie Sie das SiteMapResolve-Ereignis einer ASP.NET-Webseite behandeln, um die vom SiteMapPath-Steuerelement angezeigten Ziel-URLs zu ändern. In diesem Beispiel ist die aktuelle Seite eine Seite mit einem Posting in einem Bulletinboard oder Forum. Zur besseren Übersichtlichkeit werden in der Sitenavigation den vom SiteMapPath-Steuerelement angezeigten Knoten-URLs kontextrelevante Abfragenzeichenfolgen angehängt. Verwenden Sie den folgenden Code, um das Steuerelement darzustellen.

<asp:SiteMapPath
id="SiteMapPath1"

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

RenderCurrentNodeAsLink="true" />

Positionieren Sie bei der Ausführung des Beispiels den Cursor über die Links im SiteMapPath-Steuerelement, um die Änderungen an den URLs zu sehen.

Dieses Beispiel fügt der Datei Web.sitemap keine SiteMapNode-Elemente hinzu, da die Datei Web.sitemap nur manuell bearbeitet werden kann.

Hinweis:

Es ist sicher, aus dem SiteMapResolveEventHandler heraus auf die CurrentNode-Eigenschaft zuzugreifen. Die Sitenavigationsinfrastruktur von ASP.NET schützt in diesem Fall vor unendlicher Rekursion.

Im Beispiel wird davon ausgegangen, dass bereits eine gültige Siteübersichtsdatei vorhanden ist, und dass die aktuelle Seite mindestens auf der dritten untergeordneten Knotenebene der Siteübersichtsstruktur liegt. Weitere Informationen zum Erstellen von Siteübersichten finden Sie unter ASP.NET-Siteübersichten.

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;
}

Sicherheit

Ein wichtiger Aspekt im Umgang mit Abfragenzeichenfolgen und Formulardaten ist die Validierung der übergebenen Daten. ASP.NET stellt eine Reihe von Validierungssteuerelementen bereit, die eine benutzerfreundliche, aber leistungsstarke Möglichkeit bieten, Formulare auf Fehler zu überprüfen und bei Bedarf Fehlermeldungen an den Benutzer auszugeben. Im vorangehenden Beispiel wurden keine Validierungssteuerelemente verwendet, um das Ändern von Siteübersichtsknoten konzentrierter darstellen zu können. Wie Sie Ihrem Code Validierungssteuerelemente hinzufügen, erfahren Sie unter ASP.NET-Validierungssteuerelemente.

Siehe auch

Konzepte

Ereignisse in ASP.NET-Master- und Inhaltsseiten

Sichern der ASP.NET-Sitenavigation

Sichern des Datenzugriffs

Referenz

SiteMapResolve

SiteMapNode

SiteMapPath

Context

Weitere Ressourcen

ASP.NET-Validierungssteuerelemente

Behandeln und Auslösen von Ereignissen

ASP.NET-Anwendungssicherheit in Hostumgebungen