Share via


Erstellen eines benutzerdefinierten Anbieters für datenbankgesteuerte Siteübersichten (VB)

von Scott Mitchell

PDF herunterladen

Der Standardwebsitezuordnungsanbieter in ASP.NET 2.0 ruft seine Daten aus einer statischen XML-Datei ab. Während der XML-basierte Anbieter für viele kleine und mittlere Websites geeignet ist, erfordern größere Webanwendungen eine dynamischere Websiteübersicht. In diesem Tutorial erstellen wir einen benutzerdefinierten Siteübersichtsanbieter, der seine Daten aus der Geschäftslogikebene abruft, die wiederum Daten aus der Datenbank abruft.

Einführung

ASP.NET 2.0 s-Siteübersichtsfeatures ermöglicht es einem Seitenentwickler, eine Websiteübersicht einer Webanwendung in einem persistenten Medium zu definieren, z. B. in einer XML-Datei. Nach der Definition kann programmgesteuert über die SiteMap Klasse im System.Web Namespace oder über eine Vielzahl von Navigations-Websteuerelementen, z. B. das SiteMapPath-, Menu- und TreeView-Steuerelement, auf die Site map-Daten zugegriffen werden. Das Siteübersichtssystem verwendet das Anbietermodell, sodass verschiedene Implementierungen zur Serialisierung der Siteübersicht erstellt und an eine Webanwendung angeschlossen werden können. Der Mit ASP.NET 2.0 ausgelieferte Standardanbieter für die Siteübersicht behält die Struktur der Siteübersicht in einer XML-Datei bei. Zurück im Tutorial Gestaltungsvorlagen und Websitenavigation haben wir eine Datei mit dem Namen erstellt Web.sitemap , die diese Struktur enthielt und deren XML mit jedem neuen Tutorialabschnitt aktualisiert wurde.

Der XML-basierte Standardanbieter für Websitezuordnungen funktioniert gut, wenn die Struktur der Websiteübersicht ziemlich statisch ist, z. B. für diese Tutorials. In vielen Szenarien ist jedoch eine dynamischere Standortübersicht erforderlich. Betrachten Sie die in Abbildung 1 gezeigte Websiteübersicht, in der jede Kategorie und jedes Produkt als Abschnitte in der Websitestruktur angezeigt werden. Mit dieser Websiteübersicht kann der Besuch der Webseite, die dem Stammknoten entspricht, alle Kategorien auflisten, während der Besuch einer bestimmten Kategorie-Webseite die Produkte dieser Kategorie auflisten und das Anzeigen einer bestimmten Produktwebseite die Produktdetails anzeigen würde.

Die Kategorien und Produkte bilden die Struktur der Site Map

Abbildung 1: Die Kategorien und Produkte bilden die Struktur der Websiteübersicht (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Obwohl diese kategorie- und produktbasierte Struktur in die Web.sitemap Datei hartcodiert werden könnte, muss die Datei jedes Mal aktualisiert werden, wenn eine Kategorie oder ein Produkt hinzugefügt, entfernt oder umbenannt wurde. Folglich würde die Websiteübersichtswartung erheblich vereinfacht, wenn die Struktur aus der Datenbank oder idealerweise aus der Geschäftslogikebene der Anwendungsarchitektur abgerufen würde. Wenn Produkte und Kategorien hinzugefügt, umbenannt oder gelöscht wurden, würde die Websiteübersicht automatisch aktualisiert, um diese Änderungen widerzuspiegeln.

Da ASP.NET 2.0 s-Siteübersichtsserialisierung auf dem Anbietermodell erstellt wird, können wir einen eigenen benutzerdefinierten Siteübersichtsanbieter erstellen, der seine Daten aus einem alternativen Datenspeicher wie der Datenbank oder der Architektur erfasst. In diesem Tutorial erstellen wir einen benutzerdefinierten Anbieter, der seine Daten aus der BLL abruft. Los geht's!

Hinweis

Der in diesem Tutorial erstellte benutzerdefinierte Siteübersichtsanbieter ist eng mit der Architektur und dem Datenmodell der Anwendung verknüpft. Jeff Prosise s Storage Site Maps in SQL Server and The SQL Site Map Provider You ve Been Waiting For artikel untersucht einen generalisierten Ansatz zum Speichern von Siteübersichtsdaten in SQL Server.

Schritt 1: Erstellen der benutzerdefinierten Websiteübersichtsanbieter-Webseiten

Bevor wir mit dem Erstellen eines benutzerdefinierten Siteübersichtsanbieters beginnen, fügen wir zunächst die ASP.NET Seiten hinzu, die wir für dieses Tutorial benötigen. Beginnen Sie mit dem Hinzufügen eines neuen Ordners mit dem Namen SiteMapProvider. Fügen Sie als Nächstes die folgenden ASP.NET Seiten zu diesem Ordner hinzu, und stellen Sie sicher, dass jede Seite der Site.master master Seite zugeordnet wird:

  • Default.aspx
  • ProductsByCategory.aspx
  • ProductDetails.aspx

Fügen Sie dem App_Code Ordner auch einen CustomProviders Unterordner hinzu.

Hinzufügen der ASP.NET Seiten für die Websiteübersicht Provider-Related Tutorials

Abbildung 2: Hinzufügen der ASP.NET Seiten für die Websiteübersicht Provider-Related Tutorials

Da es nur ein Tutorial für diesen Abschnitt gibt, müssen Default.aspx wir die Tutorials des Abschnitts nicht auflisten. Stattdessen Default.aspx werden die Kategorien in einem GridView-Steuerelement angezeigt. Wir gehen dies in Schritt 2 an.

Aktualisieren Sie als Nächstes, Web.sitemap um einen Verweis auf die Default.aspx Seite einzuschließen. Fügen Sie insbesondere das folgende Markup nach dem Zwischenspeichern <siteMapNode>hinzu:

<siteMapNode 
    title="Customizing the Site Map" url="~/SiteMapProvider/Default.aspx" 
    description="Learn how to create a custom provider that retrieves the site map 
                 from the Northwind database." />

Nehmen Sie sich nach dem Aktualisieren Web.sitemapeinen Moment Zeit, um die Tutorials-Website über einen Browser anzuzeigen. Das Menü auf der linken Seite enthält jetzt ein Element für das Tutorial für den einzigen Siteübersichtsanbieter.

Die Siteübersicht enthält jetzt einen Eintrag für das Tutorial zum Site Map Provider

Abbildung 3: Die Siteübersicht enthält jetzt einen Eintrag für das Tutorial zum Site Map Provider

Dieses Tutorial konzentriert sich Standard darauf, das Erstellen eines benutzerdefinierten Siteübersichtsanbieters und die Konfiguration einer Webanwendung für die Verwendung dieses Anbieters zu veranschaulichen. Insbesondere erstellen wir einen Anbieter, der eine Siteübersicht zurückgibt, die einen Stammknoten zusammen mit einem Knoten für jede Kategorie und jedes Produkt enthält, wie in Abbildung 1 dargestellt. Im Allgemeinen kann jeder Knoten in der Siteübersicht eine URL angeben. Für unsere Websiteübersicht lautet ~/SiteMapProvider/Default.aspxdie URL des Stammknotens , die alle Kategorien in der Datenbank auflistet. Jeder Kategorieknoten in der Websiteübersicht verfügt über eine URL, die auf ~/SiteMapProvider/ProductsByCategory.aspx?CategoryID=categoryIDzeigt, in der alle Produkte in der angegebenen categoryID aufgelistet werden. Schließlich zeigt jeder Knoten der Produktwebsiteübersicht auf ~/SiteMapProvider/ProductDetails.aspx?ProductID=productID, in dem die spezifischen Produktdetails angezeigt werden.

Um zu beginnen, müssen wir die Default.aspxSeiten , ProductsByCategory.aspxund ProductDetails.aspx erstellen. Diese Seiten werden in den Schritten 2, 3 bzw. 4 abgeschlossen. Da der Schwerpunkt dieses Tutorials auf Siteübersichtsanbieter liegt und sich in den vergangenen Tutorials die Erstellung dieser Arten von mehrseitigen master/Detailberichten befasst hat, werden wir die Schritte 2 bis 4 durchlaufen. Wenn Sie eine Aktualisierung zum Erstellen von master-/Detailberichten benötigen, die sich über mehrere Seiten erstrecken, lesen Sie das Tutorial Master-/Detailfilterung über zwei Seiten.

Schritt 2: Anzeigen einer Liste von Kategorien

Öffnen Sie die Default.aspx Seite im SiteMapProvider Ordner, und ziehen Sie eine GridView aus der Toolbox auf die Designer, und legen Sie sie ID auf festCategories. Binden Sie es über das Smarttag von GridView an eine neue ObjectDataSource mit dem Namen CategoriesDataSource , und konfigurieren Sie es so, dass die Daten mithilfe der CategoriesBLL Klasse s-Methode GetCategories abgerufen werden. Da diese GridView nur die Kategorien anzeigt und keine Datenänderungsfunktionen bereitstellt, legen Sie die Dropdownlisten in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) fest.

Konfigurieren der ObjectDataSource zum Zurückgeben von Kategorien mithilfe der GetCategories-Methode

Abbildung 4: Konfigurieren der ObjectDataSource zum Zurückgeben von Kategorien mithilfe der GetCategories -Methode (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Legen Sie die Drop-Down Listen in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) fest.

Abbildung 5: Festlegen der Drop-Down Listen in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) (Klicken Sie, um das bild in voller Größe anzuzeigen)

Nach Abschluss des Assistenten zum Konfigurieren von Datenquellen fügt Visual Studio ein BoundField für CategoryID, , CategoryNameDescription, NumberOfProductsund BrochurePathhinzu. Bearbeiten Sie gridView so, dass sie nur die CategoryName Und Description BoundFields enthält, und aktualisieren Sie die CategoryName BoundField-Eigenschaft in HeaderText Category .

Fügen Sie als Nächstes ein HyperLinkField-Objekt hinzu, und positionieren Sie es so, dass es sich um das linksste Feld befindet. Legen Sie die DataNavigateUrlFields-Eigenschaft auf CategoryID und die DataNavigateUrlFormatString-Eigenschaft auf ~/SiteMapProvider/ProductsByCategory.aspx?CategoryID={0} fest. Legen Sie die Text -Eigenschaft auf Produkte anzeigen fest.

Hinzufügen eines HyperLinkField zur GridView für Kategorien

Abbildung 6: Hinzufügen eines HyperLinkField zur Categories GridView

Nach dem Erstellen der ObjectDataSource und dem Anpassen der GridView-Felder sehen die beiden Steuerelemente deklaratives Markup wie folgt aus:

<asp:GridView ID="Categories" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="CategoryID" DataSourceID="CategoriesDataSource" 
    EnableViewState="False">
    <Columns>
        <asp:HyperLinkField DataNavigateUrlFields="CategoryID" 
            DataNavigateUrlFormatString=
                "~/SiteMapProvider/ProductsByCategory.aspx?CategoryID={0}"
            Text="View Products" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category" 
            SortExpression="CategoryName" />
        <asp:BoundField DataField="Description" HeaderText="Description" 
            SortExpression="Description" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetCategories" 
    TypeName="CategoriesBLL"></asp:ObjectDataSource>

Abbildung 7 zeigt Default.aspx , wenn sie über einen Browser angezeigt wird. Wenn Sie auf einen Link "Produkte anzeigen" klicken, gelangen Sie zu ProductsByCategory.aspx?CategoryID=categoryID, den wir in Schritt 3 erstellen.

Jede Kategorie wird zusammen mit einem Link

Abbildung 7: Jede Kategorie wird zusammen mit einem Link "Produkte anzeigen" aufgeführt (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Schritt 3: Auflisten der ausgewählten Produkte der Kategorie

Öffnen Sie die ProductsByCategory.aspx Seite, und fügen Sie eine GridView hinzu, und nennen Sie sie ProductsByCategory. Binden Sie die GridView über das Smarttag an eine neue ObjectDataSource mit dem Namen ProductsByCategoryDataSource. Konfigurieren Sie die ObjectDataSource so, dass die Methode der ProductsBLL Klasse s GetProductsByCategoryID(categoryID) verwendet wird, und legen Sie die Dropdownlisten auf den Registerkarten UPDATE, INSERT und DELETE auf (None) fest.

Verwenden Der ProductsBLL-Klasse-Methode GetProductsByCategoryID(categoryID)

Abbildung 8: Verwenden der ProductsBLL Klasse s-Methode (Klicken Sie hier, um das bild in voller Größe anzuzeigen)GetProductsByCategoryID(categoryID)

Im letzten Schritt des Assistenten datenquelle konfigurieren wird zur Eingabe einer Parameterquelle für categoryID aufgefordert. Da diese Informationen durch das Feld CategoryIDquerystring übergeben werden, wählen Sie queryString aus der Dropdownliste aus, und geben Sie CategoryID in das Textfeld QueryStringField ein, wie in Abbildung 9 dargestellt. Klicken Sie auf Fertig stellen, um den Assistenten abzuschließen.

Verwenden des CategoryID-Abfragezeichenfolgenfelds für den categoryID-Parameter

Abbildung 9: Verwenden des CategoryID Querystring-Felds für den categoryID-Parameter (Klicken Sie hier, um das vollständige Bild anzuzeigen)

Nach Abschluss des Assistenten fügt Visual Studio der GridView für die Produktdatenfelder entsprechende BoundFields und ein CheckBoxField-Element hinzu. Entfernen Sie alle außer , ProductNameUnitPriceund SupplierName BoundFields. Passen Sie diese drei BoundFields-Eigenschaften HeaderText so an, dass sie "Product", "Price" bzw. "Supplier" lesen. Formatieren Sie das UnitPrice BoundField als Währung.

Fügen Sie als Nächstes ein HyperLinkField-Objekt hinzu, und verschieben Sie es an die linksste Position. Legen Sie die Text -Eigenschaft auf Details anzeigen, die - DataNavigateUrlFields Eigenschaft auf ProductIDund die DataNavigateUrlFormatString -Eigenschaft auf ~/SiteMapProvider/ProductDetails.aspx?ProductID={0}fest.

Hinzufügen eines HyperLinkfields für Ansichtsdetails, das auf ProductDetails.aspx verweist

Abbildung 10: Hinzufügen eines HyperLinkField-Ansichtsdetails, auf das verweist ProductDetails.aspx

Nach diesen Anpassungen sollte das deklarative Markup von GridView und ObjectDataSource wie folgt aussehen:

<asp:GridView ID="ProductsByCategory" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ProductsByCategoryDataSource" 
    EnableViewState="False">
    <Columns>
        <asp:HyperLinkField DataNavigateUrlFields="ProductID" 
            DataNavigateUrlFormatString=
                "~/SiteMapProvider/ProductDetails.aspx?ProductID={0}"
            Text="View Details" />
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" 
            HeaderText="Price" HtmlEncode="False" 
            SortExpression="UnitPrice" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier" 
            ReadOnly="True" SortExpression="SupplierName" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsByCategoryDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductsByCategoryID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:QueryStringParameter Name="categoryID" 
            QueryStringField="CategoryID" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Kehren Sie zum Anzeigen Default.aspx über einen Browser zurück, und klicken Sie auf den Link Produkte für Getränke anzeigen. Dies führt Sie zu , um ProductsByCategory.aspx?CategoryID=1die Namen, Preise und Lieferanten der Produkte in der Northwind-Datenbank anzuzeigen, die zur Kategorie Getränke gehören (siehe Abbildung 11). Sie können diese Seite noch weiter erweitern, um einen Link zum Zurückgeben von Benutzern zur Kategorielistenseite (Default.aspx) und ein DetailsView- oder FormView-Steuerelement zu enthalten, das den Namen und die Beschreibung der ausgewählten Kategorie anzeigt.

Die Namen, Preise und Lieferanten von Getränken werden angezeigt.

Abbildung 11: Die Namen, Preise und Lieferanten von Getränken werden angezeigt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 4: Anzeigen von Produktdetails

Auf der letzten Seite ProductDetails.aspxwerden die Details der ausgewählten Produkte angezeigt. Öffnen Sie ProductDetails.aspx detailsView, und ziehen Sie sie aus der Toolbox auf die Designer. Legen Sie die DetailsView-Eigenschaft ID auf fest ProductInfo , und löschen Sie deren Height Eigenschaftswerte und Width . Binden Sie die DetailsView über das Smarttag an eine neue ObjectDataSource mit dem Namen ProductDataSource, und konfigurieren Sie ObjectDataSource so, dass sie ihre Daten aus der s-Methode der ProductsBLL Klasse GetProductByProductID(productID) pullt. Legen Sie wie bei den vorherigen Webseiten, die in Den Schritten 2 und 3 erstellt wurden, die Dropdownlisten in den Registerkarten UPDATE, INSERT und DELETE auf (Keine) fest.

Konfigurieren der ObjectDataSource für die Verwendung der GetProductByProductID(productID)-Methode

Abbildung 12: Konfigurieren der ObjectDataSource für die Verwendung der GetProductByProductID(productID) -Methode (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Im letzten Schritt des Assistenten zum Konfigurieren von Datenquellen wird zur Eingabe der Quelle des productID-Parameters aufgefordert. Da diese Daten über das Abfragezeichenfolgenfeld ProductIDerfolgen, legen Sie die Dropdownliste auf QueryString und das Textfeld QueryStringField auf ProductID fest. Klicken Sie abschließend auf die Schaltfläche Fertig stellen, um den Assistenten abzuschließen.

Konfigurieren des productID-Parameters zum Pullen des Werts aus dem ProductID-Abfragezeichenfolgenfeld

Abbildung 13: Konfigurieren des productID-Parameters zum Pullen des Werts aus dem ProductID Abfragezeichenfolgenfeld (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Nach Abschluss des Assistenten zum Konfigurieren von Datenquellen erstellt Visual Studio die entsprechenden BoundFields und ein CheckBoxField in der DetailsView für die Produktdatenfelder. Entfernen Sie , ProductIDSupplierIDund CategoryID BoundFields, und konfigurieren Sie die verbleibenden Felder nach Bedarf. Nach einer Handvoll ästhetischer Konfigurationen sah mein deklaratives Markup für DetailsView und ObjectDataSource wie folgt aus:

<asp:DetailsView ID="ProductInfo" runat="server" AutoGenerateRows="False" 
    DataKeyNames="ProductID" DataSourceID="ProductDataSource" 
    EnableViewState="False">
    <Fields>
        <asp:BoundField DataField="ProductName" HeaderText="Product" 
            SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category" 
            ReadOnly="True" SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier" 
            ReadOnly="True" SortExpression="SupplierName" />
        <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit" 
            SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" 
            HeaderText="Price" HtmlEncode="False" 
            SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock" HeaderText="Units In Stock" 
            SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder" HeaderText="Units On Order" 
            SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel" HeaderText="Reorder Level" 
            SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" 
            SortExpression="Discontinued" />
    </Fields>
</asp:DetailsView>
<asp:ObjectDataSource ID="ProductDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductByProductID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:QueryStringParameter Name="productID" 
            QueryStringField="ProductID" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Um diese Seite zu testen, kehren Sie zurück, Default.aspx und klicken Sie auf Produkte anzeigen für die Kategorie Getränke. Klicken Sie in der Liste der Getränkeprodukte auf den Link Details anzeigen für Chai Tea. Dadurch gelangen Sie zu ProductDetails.aspx?ProductID=1, wo Details eines Chai-Tees angezeigt werden (siehe Abbildung 14).

Chai Tea s Lieferanten, Kategorie, Preis und andere Informationen werden angezeigt

Abbildung 14: Chai Teas Supplier, Category, Price, and Other Information is Displayed (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 5: Grundlegendes zum inneren Funktionieren eines Site Map-Anbieters

Die Websitezuordnung wird im Arbeitsspeicher des Webservers als Sammlung von SiteMapNode Instanzen dargestellt, die eine Hierarchie bilden. Es muss genau ein Stamm vorhanden sein, alle Nicht-Stammknoten müssen genau einen übergeordneten Knoten aufweisen, und alle Knoten können eine beliebige Anzahl von untergeordneten Elementen aufweisen. Jedes SiteMapNode Objekt stellt einen Abschnitt in der Struktur der Website dar. Diese Abschnitte verfügen in der Regel über eine entsprechende Webseite. Folglich verfügt die SiteMapNode -Klasse über Eigenschaften wie Title, Urlund Description, die Informationen für den Abschnitt bereitstellen, den der SiteMapNode darstellt. Es gibt auch eine Key Eigenschaft, die jede SiteMapNode in der Hierarchie eindeutig identifiziert, sowie Eigenschaften, die zum Einrichten dieser Hierarchie ChildNodesverwendet werden, ParentNode, NextSibling, PreviousSiblingusw.

Abbildung 15 zeigt die allgemeine Struktur der Standortkarte aus Abbildung 1, wobei jedoch die Implementierungsdetails detaillierter dargestellt sind.

Jeder SiteMapNode verfügt über Eigenschaften wie Titel, URL, Schlüssel usw.

Abbildung 15: Jedes SiteMapNode Element verfügt über Eigenschaften wie Title, Url, Keyund So On (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Auf die Siteübersicht kann über die SiteMap -Klasse im System.Web -Namespace zugegriffen werden. Diese Eigenschaft der RootNode Klasse gibt die Stamm-instance SiteMapNode der Siteübersicht zurück. CurrentNode Gibt die SiteMapNode zurück, deren Url Eigenschaft mit der URL der aktuell angeforderten Seite übereinstimmt. Diese Klasse wird intern von ASP.NET 2.0 s Navigationswebsteuerelementen verwendet.

Wenn auf die Eigenschaften der SiteMap Klasse zugegriffen wird, muss die Siteübersichtsstruktur von einem persistenten Medium in den Arbeitsspeicher serialisiert werden. Die Serialisierungslogik der Sitezuordnung ist jedoch nicht hart in die SiteMap -Klasse codiert. Stattdessen bestimmt die SiteMap -Klasse zur Laufzeit, welcher Siteübersichtsanbieter für die Serialisierung verwendet werden soll. Standardmäßig wird die XmlSiteMapProvider -Klasse verwendet, die die Struktur der Siteübersicht aus einer ordnungsgemäß formatierten XML-Datei liest. Mit ein wenig Arbeit können wir jedoch einen eigenen benutzerdefinierten Site map-Anbieter erstellen.

Alle Siteübersichtsanbieter müssen von der SiteMapProvider -Klasse abgeleitet werden, die die wesentlichen Methoden und Eigenschaften enthält, die für Siteübersichtsanbieter erforderlich sind, aber viele der Implementierungsdetails auslässt. Eine zweite Klasse, StaticSiteMapProvider, erweitert die SiteMapProvider -Klasse und enthält eine robustere Implementierung der erforderlichen Funktionalität. Intern speichert die StaticSiteMapProviderSiteMapNode Instanzen der Siteübersicht in einem Hashtable und stellt Methoden wie AddNode(child, parent)bereit, RemoveNode(siteMapNode), und Clear() die dem internen Hashtablehinzufügen und entfernen SiteMapNode s. XmlSiteMapProvider wird von StaticSiteMapProvider abgeleitet.

Beim Erstellen eines benutzerdefinierten Siteübersichtsanbieters, der erweitert StaticSiteMapProvider, müssen zwei abstrakte Methoden überschrieben werden: BuildSiteMap und GetRootNodeCore. BuildSiteMapist, wie der Name schon sagt, für das Laden der Siteübersichtsstruktur aus persistentem Speicher und die Erstellung im Arbeitsspeicher verantwortlich. GetRootNodeCore gibt den Stammknoten in der Siteübersicht zurück.

Bevor eine Webanwendung einen Siteübersichtsanbieter verwenden kann, muss sie in der Konfiguration der Anwendung registriert sein. Standardmäßig wird die XmlSiteMapProvider -Klasse mit dem Namen AspNetXmlSiteMapProviderregistriert. Um zusätzliche Siteübersichtsanbieter zu registrieren, fügen Sie das folgende Markup zu hinzu Web.config:

<configuration>
    <system.web>
        ...
        <siteMap defaultProvider="defaultProviderName">
          <providers>
            <add name="name" type="type" />
          </providers>
        </siteMap>
    </system.web>
</configuration>

Der Name-Wert weist dem Anbieter einen lesbaren Namen zu, während type den vollqualifizierten Typnamen des Siteübersichtsanbieters angibt. In Schritt 7 untersuchen wir konkrete Werte für die Namen - und Typwerte , nachdem wir unseren benutzerdefinierten Siteübersichtsanbieter erstellt haben.

Die Siteübersichtsanbieterklasse wird beim ersten Zugriff von der SiteMap -Klasse instanziiert und verbleibt während der Lebensdauer der Webanwendung im Arbeitsspeicher. Da es nur einen instance des Siteübersichtsanbieters gibt, der von mehreren gleichzeitigen Websitebesuchern aufgerufen werden kann, ist es zwingend erforderlich, dass die Methoden des Anbieters threadsicher sind.

Aus Leistungs- und Skalierbarkeitsgründen ist es wichtig, dass wir die In-Memory-Site map-Struktur zwischenspeichern und diese zwischengespeicherte Struktur zurückgeben, anstatt sie jedes Mal neu zu erstellen, wenn die BuildSiteMap Methode aufgerufen wird. BuildSiteMap kann je nach den auf der Seite verwendeten Navigationssteuerelementen und der Tiefe der Websiteübersichtsstruktur mehrmals pro Seitenanforderung pro Benutzer aufgerufen werden. Wenn wir die Site map-Struktur BuildSiteMap in nicht zwischenspeichern, müssten wir in jedem Fall bei jedem Aufruf die Produkt- und Kategorieinformationen aus der Architektur erneut abrufen (was zu einer Abfrage der Datenbank führen würde). Wie in den vorherigen Tutorials zum Zwischenspeichern erläutert, können zwischengespeicherte Daten veraltet sein. Um dies zu bekämpfen, können wir entweder zeit- oder SQL-Cacheabhängigkeiten verwenden, die auf Abhängigkeiten basieren.

Hinweis

Ein Siteübersichtsanbieter kann die Initialize -Methode optional außer Kraft setzen. Initialize wird aufgerufen, wenn der Siteübersichtsanbieter zuerst instanziiert wird, und alle benutzerdefinierten Attribute übergeben, die dem Anbieter in Web.config im <add> -Element zugewiesen sind, z. B.: <add name="name" type="type" customAttribute="value" />. Dies ist nützlich, wenn Sie einem Seitenentwickler erlauben möchten, verschiedene Site map provider-bezogene Einstellungen anzugeben, ohne den Code des Anbieters ändern zu müssen. Wenn wir z. B. die Kategorie- und Produktdaten direkt aus der Datenbank und nicht über die Architektur lesen würden, würde der Seitenentwickler wahrscheinlich die Datenbank angeben VerbindungszeichenfolgeWeb.config, anstatt einen hartcodierten Wert im Code des Anbieters zu verwenden. Der benutzerdefinierte Siteübersichtsanbieter, den wir in Schritt 6 erstellen, setzt diese Initialize Methode nicht außer Kraft. Ein Beispiel für die Verwendung der Initialize -Methode finden Sie im Artikel Speichern von Site maps in SQL Server von Jeff Prosise.

Schritt 6: Erstellen des benutzerdefinierten Site Map-Anbieters

Um einen benutzerdefinierten Siteübersichtsanbieter zu erstellen, der die Siteübersicht aus den Kategorien und Produkten in der Northwind-Datenbank erstellt, müssen wir eine Klasse erstellen, die erweitert StaticSiteMapProvider. In Schritt 1 habe ich Sie aufgefordert, einen CustomProviders Ordner im App_Code Ordner hinzuzufügen. Fügen Sie diesem Ordner eine neue Klasse mit dem Namen NorthwindSiteMapProviderhinzu. Fügen Sie der NorthwindSiteMapProvider-Klasse den folgenden Code hinzu:

Imports System.Web
Imports System.Web.Caching
Public Class NorthwindSiteMapProvider
    Inherits StaticSiteMapProvider
    Private ReadOnly siteMapLock As New Object()
    Private root As SiteMapNode = Nothing
    Public Const CacheDependencyKey As String = "NorthwindSiteMapProviderCacheDependency"
    Public Overrides Function BuildSiteMap() As System.Web.SiteMapNode
        ' Use a lock to make this method thread-safe
        SyncLock siteMapLock
            ' First, see if we already have constructed the
            ' rootNode. If so, return it...
            If root IsNot Nothing Then
                Return root
            End If
            ' We need to build the site map!
            ' Clear out the current site map structure
            MyBase.Clear()
            ' Get the categories and products information from the database
            Dim productsAPI As New ProductsBLL()
            Dim products As Northwind.ProductsDataTable = productsAPI.GetProducts()
            ' Create the root SiteMapNode
            root = New SiteMapNode( _
                Me, "root", "~/SiteMapProvider/Default.aspx", "All Categories")
            AddNode(root)
            ' Create SiteMapNodes for the categories and products
            For Each product As Northwind.ProductsRow In products
                ' Add a new category SiteMapNode, if needed
                Dim categoryKey, categoryName As String
                Dim createUrlForCategoryNode As Boolean = True
                If product.IsCategoryIDNull() Then
                    categoryKey = "Category:None"
                    categoryName = "None"
                    createUrlForCategoryNode = False
                Else
                    categoryKey = String.Concat("Category:", product.CategoryID)
                    categoryName = product.CategoryName
                End If
                Dim categoryNode As SiteMapNode = FindSiteMapNodeFromKey(categoryKey)
                ' Add the category SiteMapNode if it does not exist
                If categoryNode Is Nothing Then
                    Dim productsByCategoryUrl As String = String.Empty
                    If createUrlForCategoryNode Then
                        productsByCategoryUrl = _
                            "~/SiteMapProvider/ProductsByCategory.aspx?CategoryID=" & _
                            product.CategoryID
                    End If
                    categoryNode = New SiteMapNode _
                        (Me, categoryKey, productsByCategoryUrl, categoryName)
                    AddNode(categoryNode, root)
                End If
                ' Add the product SiteMapNode
                Dim productUrl As String = _
                    "~/SiteMapProvider/ProductDetails.aspx?ProductID=" & _
                    product.ProductID
                Dim productNode As New SiteMapNode _
                    (Me, String.Concat("Product:", product.ProductID), _
                    productUrl, product.ProductName)
                AddNode(productNode, categoryNode)
            Next
            ' Add a "dummy" item to the cache using a SqlCacheDependency
            ' on the Products and Categories tables
            Dim productsTableDependency As New _
                System.Web.Caching.SqlCacheDependency("NorthwindDB", "Products")
            Dim categoriesTableDependency As New _
                System.Web.Caching.SqlCacheDependency("NorthwindDB", "Categories")
            ' Create an AggregateCacheDependency
            Dim aggregateDependencies As New System.Web.Caching.AggregateCacheDependency()
            aggregateDependencies.Add(productsTableDependency, categoriesTableDependency)
            ' Add the item to the cache specifying a callback function
            HttpRuntime.Cache.Insert( _
                CacheDependencyKey, DateTime.Now, aggregateDependencies, _
                Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, _
                CacheItemPriority.Normal, AddressOf OnSiteMapChanged)
            ' Finally, return the root node
            Return root
        End SyncLock
    End Function
    Protected Overrides Function GetRootNodeCore() As System.Web.SiteMapNode
        Return BuildSiteMap()
    End Function
    Protected Sub OnSiteMapChanged _
    (key As String, value As Object, reason As CacheItemRemovedReason)
        SyncLock siteMapLock
            If String.Compare(key, CacheDependencyKey) = 0 Then
                ' Refresh the site map
                root = Nothing
            End If
        End SyncLock
    End Sub
    Public ReadOnly Property CachedDate() As Nullable(Of DateTime)
        Get
            Dim value As Object = HttpRuntime.Cache(CacheDependencyKey)
            If value Is Nothing OrElse Not TypeOf value Is Nullable(Of DateTime) Then
                Return Nothing
            Else
                Return CType(value, Nullable(Of DateTime))
            End If
        End Get
    End Property
End Class

Beginnen wir mit der Untersuchung dieser Klasse s-Methode BuildSiteMap , die mit einer lock -Anweisung beginnt. Die lock -Anweisung lässt nur jeweils einen Thread zu, wodurch der Zugriff auf den Code serialisiert wird und verhindert, dass zwei gleichzeitige Threads aufeinander treten.

Die Variable root auf Klassenebene SiteMapNode wird verwendet, um die Siteübersichtsstruktur zwischenzuspeichern. Wenn die Siteübersicht zum ersten Mal oder zum ersten Mal nach der Änderung der zugrunde liegenden Daten erstellt wird, root und Nothing die Struktur der Siteübersicht wird erstellt. Der Stammknoten der Siteübersicht wird während des Erstellungsprozesses zugewiesen root , root sodass beim nächsten Aufruf dieser Methode nicht angezeigt wird Nothing. Daher wird die Siteübersichtsstruktur nicht Nothing an den Aufrufer zurückgegeben, root ohne sie neu erstellen zu müssen.

Wenn stamm ist Nothing, wird die Siteübersichtsstruktur aus den Produkt- und Kategorieinformationen erstellt. Die Siteübersicht wird erstellt, indem die SiteMapNode -Instanzen erstellt und dann die Hierarchie durch Aufrufe der StaticSiteMapProvider -Klasse s-Methode AddNode erstellt wird. AddNode führt die interne Buchhaltung aus, und speichert die sortierten SiteMapNode Instanzen in einem Hashtable. Bevor wir mit dem Erstellen der Hierarchie beginnen, rufen wir zunächst die Clear -Methode auf, die die Elemente aus dem internen Hashtableentfernt. Als Nächstes werden die ProductsBLL Methode s GetProducts der Klasse und die resultierenden ProductsDataTable in lokalen Variablen gespeichert.

Die Erstellung der Siteübersicht beginnt mit dem Erstellen des Stammknotens und dem Zuweisen zu root. Die überladene s-Konstruktor, dieSiteMapNode hier und während dieser BuildSiteMap verwendet wird, wird die folgenden Informationen übergeben:

  • Ein Verweis auf den Siteübersichtsanbieter (Me).
  • Der SiteMapNode s Key. Dieser erforderliche Wert muss für jede SiteMapNodeeindeutig sein.
  • Der SiteMapNode s Url. Url ist optional, aber wenn angegeben, muss jeder SiteMapNode s-Wert Url eindeutig sein.
  • Der SiteMapNode s Title, der erforderlich ist.

Der AddNode(root) -Methodenaufruf fügt der SiteMapNoderoot Sitemap als Stamm hinzu. Als Nächstes wird jedes ProductRow in aufgezählt ProductsDataTable . Wenn bereits ein SiteMapNode für die aktuelle Produktkategorie vorhanden ist, wird darauf verwiesen. Andernfalls wird eine neue SiteMapNode für die Kategorie erstellt und als untergeordnetes Element des SiteMapNode``root über den AddNode(categoryNode, root) Methodenaufruf hinzugefügt. Nachdem der entsprechende Kategorieknoten SiteMapNode gefunden oder erstellt wurde, wird ein SiteMapNode für das aktuelle Produkt erstellt und als untergeordnetes Element der Kategorie SiteMapNode über AddNode(productNode, categoryNode)hinzugefügt. Beachten Sie, dass der Eigenschaftswert der Kategorie SiteMapNode ist~/SiteMapProvider/ProductsByCategory.aspx?CategoryID=categoryID, während der Eigenschaft des Url Produkts SiteMapNode zugewiesen ~/SiteMapNode/ProductDetails.aspx?ProductID=productIDist.Url

Hinweis

Produkte, die über einen Datenbankwert NULL für ihre CategoryID verfügen, werden unter einer Kategorie SiteMapNode gruppiert, deren Title Eigenschaft auf None festgelegt ist und deren Url Eigenschaft auf eine leere Zeichenfolge festgelegt ist. Ich habe mich entschieden, auf eine leere Zeichenfolge festzulegen Url , da die Methode der ProductBLL Klasse s GetProductsByCategory(categoryID) derzeit nicht in der Lage ist, nur die Produkte mit einem NULLCategoryID Wert zurückzugeben. Außerdem wollte ich veranschaulichen, wie die Navigationssteuerelemente einen rendern, SiteMapNode dem ein Wert für seine Url Eigenschaft fehlt. Ich ermutige Sie, dieses Tutorial so zu erweitern, dass die None SiteMapNode s-Eigenschaft Url auf ProductsByCategory.aspxzeigt, aber nur die Produkte mitCategoryIDNULLWerten anzeigt.

Nach dem Erstellen der Websitezuordnung wird dem Datencache mithilfe einer SQL-Cacheabhängigkeit von den Categories Tabellen und Products über ein -Objekt ein beliebiges AggregateCacheDependency Objekt hinzugefügt. Im vorherigen Tutorial Verwenden von SQL-Cacheabhängigkeiten haben wir die Verwendung von SQL-Cacheabhängigkeiten untersucht. Der benutzerdefinierte Siteübersichtsanbieter verwendet jedoch eine Überladung der Datencachemethode, Insert die wir noch untersuchen müssen. Diese Überladung akzeptiert als letzten Eingabeparameter einen Delegaten, der aufgerufen wird, wenn das Objekt aus dem Cache entfernt wird. Insbesondere übergeben wir einen neuen CacheItemRemovedCallback Delegaten , der auf die OnSiteMapChanged Weiter unten in der NorthwindSiteMapProvider -Klasse definierte Methode verweist.

Hinweis

Die Im-Memory-Darstellung der Sitemap wird über die Variable rootauf Klassenebene zwischengespeichert. Da es nur eine instance der klasse des benutzerdefinierten Siteübersichtsanbieters gibt und diese instance von allen Threads in der Webanwendung gemeinsam genutzt wird, dient diese Klassenvariable als Cache. Die BuildSiteMap -Methode verwendet auch den Datencache, aber nur als Mittel, um Benachrichtigungen zu erhalten, wenn sich die zugrunde liegenden Datenbankdaten in den Categories Tabellen oder Products ändern. Beachten Sie, dass der in den Datencache eingefügte Wert nur dem aktuellen Datum und der aktuellen Uhrzeit entspricht. Die tatsächlichen Siteübersichtsdaten werden nicht in den Datencache eingefügt.

Die BuildSiteMap -Methode wird abgeschlossen, indem der Stammknoten der Siteübersicht zurückgegeben wird.

Die übrigen Methoden sind ziemlich einfach. GetRootNodeCore ist für die Rückgabe des Stammknotens verantwortlich. Da BuildSiteMap der Stamm zurückgibt, GetRootNodeCore gibt einfach den Rückgabewert s zurück BuildSiteMap . Die OnSiteMapChanged -Methode setzt root zurück auf Nothing , wenn das Cacheelement entfernt wird. Wenn der Stamm wieder auf Nothingfestgelegt ist, wird die Struktur der Siteübersicht beim nächsten BuildSiteMap Aufruf neu erstellt. Schließlich gibt die CachedDate -Eigenschaft den im Datencache gespeicherten Datums- und Uhrzeitwert zurück, sofern ein solcher Wert vorhanden ist. Diese Eigenschaft kann von einem Seitenentwickler verwendet werden, um zu bestimmen, wann die Siteübersichtsdaten zuletzt zwischengespeichert wurden.

Schritt 7: Registrieren vonNorthwindSiteMapProvider

Damit unsere Webanwendung den NorthwindSiteMapProvider in Schritt 6 erstellten Siteübersichtsanbieter verwendet, müssen wir ihn im <siteMap> Abschnitt von Web.configregistrieren. Fügen Sie insbesondere das folgende Markup innerhalb des <system.web> -Elements in Web.confighinzu:

<siteMap defaultProvider="AspNetXmlSiteMapProvider">
  <providers>
    <add name="Northwind" type="NorthwindSiteMapProvider" />
  </providers>
</siteMap>

Dieses Markup bewirkt zwei Dinge: Erstens gibt es an, dass der integrierte AspNetXmlSiteMapProvider Anbieter der Standardwebsiteübersicht ist. Zweitens registriert es den in Schritt 6 erstellten benutzerdefinierten Siteübersichtsanbieter mit dem benutzerfreundlichen Namen Northwind .

Hinweis

Für Siteübersichtsanbieter App_Code , die sich im Ordner der Anwendung befinden, ist der Wert des type Attributs einfach der Klassenname. Alternativ könnte der benutzerdefinierte Siteübersichtsanbieter in einem separaten Klassenbibliotheksprojekt erstellt werden, wobei die kompilierte Assembly im Verzeichnis der Webanwendung /Bin platziert wurde. In diesem Fall wäre der type Attributwert Namespace.ClassName, AssemblyName .

Nehmen Sie sich nach dem Aktualisieren Web.configeinen Moment Zeit, um eine beliebige Seite aus den Tutorials in einem Browser anzuzeigen. Beachten Sie, dass auf der Navigationsoberfläche auf der linken Seite weiterhin die in Web.sitemapdefinierten Abschnitte und Tutorials angezeigt werden. Dies liegt daran, dass wir den Standardanbieter beibehalten AspNetXmlSiteMapProvider haben. Um ein Navigationsbenutzeroberflächenelement zu erstellen, das verwendet NorthwindSiteMapProvider, müssen wir explizit angeben, dass der Northwind-Siteübersichtsanbieter verwendet werden soll. Wie Sie dies erreichen, erfahren Sie in Schritt 8.

Schritt 8: Anzeigen von Siteübersichtsinformationen mithilfe des benutzerdefinierten Siteübersichtsanbieters

Nachdem der benutzerdefinierte Siteübersichtsanbieter erstellt und in Web.configregistriert wurde, können wir den Seiten , ProductsByCategory.aspxund ProductDetails.aspx im SiteMapProvider Ordner Navigationssteuerelemente Default.aspxhinzufügen. Öffnen Sie zunächst die Default.aspx Seite, und ziehen Sie eine SiteMapPath aus der Toolbox auf die Designer. Das SiteMapPath-Steuerelement befindet sich im Abschnitt Navigation der Toolbox.

Hinzufügen eines SiteMapPath zu Default.aspx

Abbildung 16: Hinzufügen eines SiteMapPath zu Default.aspx (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Das SiteMapPath-Steuerelement zeigt ein Breadcrumb an, das den Aktuellen Standort der Seite innerhalb der Websiteübersicht angibt. Im Tutorial Gestaltungsvorlagen und Websitenavigation haben wir oben auf der Seite master einen SiteMapPath hinzugefügt.

Nehmen Sie sich einen Moment Zeit, um diese Seite über einen Browser anzuzeigen. Der in Abbildung 16 hinzugefügte SiteMapPath verwendet den standardmäßigen Sitemap-Anbieter und pullt seine Daten aus Web.sitemap. Daher zeigt die Breadcrumb Home > Customizing the Site Map an, genau wie das Breadcrumb in der oberen rechten Ecke.

Breadcrumb verwendet den standardmäßigen Site Map-Anbieter.

Abbildung 17: Breadcrumb verwendet den Standard-Site Map-Anbieter (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Damit siteMapPath in Abbildung 16 hinzugefügt wird, verwenden Sie den benutzerdefinierten Siteübersichtsanbieter, den wir in Schritt 6 erstellt haben, und legen Sie dessen SiteMapProvider Eigenschaft auf Northwind fest, den Namen, den wir in Web.configzugewiesen habenNorthwindSiteMapProvider. Leider verwendet die Designer weiterhin den Standardanbieter für die Websiteübersicht, aber wenn Sie die Seite nach der Änderung dieser Eigenschaft über einen Browser besuchen, werden Sie sehen, dass der Breadcrumb jetzt den benutzerdefinierten Siteübersichtsanbieter verwendet.

Screenshot, der zeigt, wie der benutzerdefinierte Site map-Anbieter im Breadcrumb angezeigt wird.

Abbildung 18: Breadcrumb verwendet jetzt den benutzerdefinierten Site Map-Anbieter (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)NorthwindSiteMapProvider

Das SiteMapPath-Steuerelement zeigt eine funktionalere Benutzeroberfläche auf den ProductsByCategory.aspx Seiten und ProductDetails.aspx an. Fügen Sie diesen Seiten einen SiteMapPath hinzu, und legen Sie die SiteMapProvider Eigenschaft in beiden auf Northwind fest. Klicken Default.aspx Sie auf den Link Produkte für Getränke anzeigen und dann auf den Link Details anzeigen für Chai Tea. Wie Abbildung 19 zeigt, enthält das Brotkrümel den aktuellen Abschnitt der Standortkarte ( Chai Tea ) und seine Vorfahren: Getränke und alle Kategorien .

Screenshot, der zeigt, wie das Breadcrumb den aktuellen Site Map-Abschnitt (Chai Tea) und seine Vorfahren (Getränke und Alle Kategorien) anzeigt.

Abbildung 19: Breadcrumb verwendet jetzt den benutzerdefinierten Site Map-Anbieter (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)NorthwindSiteMapProvider

Neben SiteMapPath können auch andere Elemente der Navigations-Benutzeroberfläche verwendet werden, z. B. die Steuerelemente Menu und TreeView. Die Default.aspxSeiten , ProductsByCategory.aspxund ProductDetails.aspx im Download für dieses Tutorial enthalten beispielsweise alle Menüsteuerelemente (siehe Abbildung 20). Ausführlichere Informationen zu den Navigationssteuerelementen und dem Websiteübersichtssystem in ASP.NET 2.0 finden Sie in den schnellstarts von ASP.NET 2.0 im Abschnitt "Komplexe Websitenavigationsfeatures" von ASP.NET 2.0 und verwenden von Websitenavigationssteuerelementen.

Das Menüsteuerelement Listen Jeder der Kategorien und Produkte

Abbildung 20: Das Menüsteuerelement Listen Jeder der Kategorien und Produkte (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Wie bereits in diesem Tutorial erwähnt, kann programmgesteuert über die -Klasse auf die Struktur der SiteMap Siteübersicht zugegriffen werden. Der folgende Code gibt den Stamm SiteMapNode des Standardanbieters zurück:

Dim root As SiteMapNode = SiteMap.RootNode

Da der AspNetXmlSiteMapProvider Standardanbieter für unsere Anwendung ist, gibt der obige Code den in Web.sitemapdefinierten Stammknoten zurück. Um auf einen anderen Siteübersichtsanbieter als den Standard zu verweisen, verwenden Sie die Eigenschaft s Providers der SiteMap Klasse wie folgt:

Dim root As SiteMapNode = SiteMap.Providers("name").RootNode

Dabei ist name der Name des benutzerdefinierten Siteübersichtsanbieters ( Northwind, für unsere Webanwendung).

Um auf ein Element zuzugreifen, das für einen Siteübersichtsanbieter spezifisch ist, rufen SiteMap.Providers["name"] Sie den Anbieter instance ab, und wandeln Sie ihn dann in den entsprechenden Typ um. Verwenden Sie beispielsweise den folgenden Code, um die NorthwindSiteMapProvider s-Eigenschaft CachedDate in einer ASP.NET-Seite anzuzeigen:

Dim customProvider As NorthwindSiteMapProvider = _
    TryCast(SiteMap.Providers("Northwind"), NorthwindSiteMapProvider)
If customProvider IsNot Nothing Then
    Dim lastCachedDate As Nullable(Of DateTime) = customProvider.CachedDate
    If lastCachedDate.HasValue Then
        SiteMapLastCachedDate.Text = _
            "Site map cached on: " & lastCachedDate.Value.ToString()
    Else
        SiteMapLastCachedDate.Text = "The site map is being reconstructed!"
    End If
End If

Hinweis

Testen Sie unbedingt das SQL-Cacheabhängigkeitsfeature. Nachdem Sie die Default.aspxSeiten , ProductsByCategory.aspxund ProductDetails.aspx besucht haben, wechseln Sie zu einem der Tutorials im Abschnitt Bearbeiten, Einfügen und Löschen, und bearbeiten Sie den Namen einer Kategorie oder eines Produkts. Kehren Sie dann zu einer der Seiten im SiteMapProvider Ordner zurück. Wenn genügend Zeit vergangen ist, bis der Abrufmechanismus die Änderung an der zugrunde liegenden Datenbank notiert, sollte die Websiteübersicht aktualisiert werden, um den neuen Produkt- oder Kategorienamen anzuzeigen.

Zusammenfassung

ASP.NET 2.0 s-Websitezuordnungsfeatures umfassen eine SiteMap -Klasse, eine Reihe integrierter Navigationswebsteuerelemente und einen Standardanbieter für die Websiteübersicht, der erwartet, dass die Siteübersichtsinformationen in einer XML-Datei beibehalten werden. Zur Verwendung von Siteübersichtsinformationen aus einer anderen Quelle, z. B. aus einer Datenbank, der Architektur der Anwendung oder einem Remotewebdienst, müssen wir einen benutzerdefinierten Siteübersichtsanbieter erstellen. Dies umfasst das Erstellen einer Klasse, die direkt oder indirekt von der SiteMapProvider -Klasse abgeleitet wird.

In diesem Tutorial haben wir erfahren, wie Sie einen benutzerdefinierten Siteübersichtsanbieter erstellen, der die Siteübersicht auf den Produkt- und Kategorieinformationen basiert, die aus der Anwendungsarchitektur stammen. Unser Anbieter hat die StaticSiteMapProvider -Klasse erweitert und eine BuildSiteMap Methode erstellt, mit der die Daten abgerufen, die Standortzuordnungshierarchie erstellt und die resultierende Struktur in einer Variablen auf Klassenebene zwischengespeichert wurde. Wir haben eine SQL-Cacheabhängigkeit mit einer Rückruffunktion verwendet, um die zwischengespeicherte Struktur für ungültig zu erklären, wenn die zugrunde liegenden Categories Daten oder Products geändert werden.

Viel Spaß beim Programmieren!

Weitere Informationen

Weitere Informationen zu den in diesem Tutorial behandelten Themen finden Sie in den folgenden Ressourcen:

Zum Autor

Scott Mitchell, Autor von sieben ASP/ASP.NET-Büchern und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft-Webtechnologien. Scott arbeitet als unabhängiger Berater, Trainer und Autor. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Er kann unter mitchell@4GuysFromRolla.comoder über seinen Blog erreicht werden, der unter http://ScottOnWriting.NETzu finden ist.

Besonderer Dank an

Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Hauptprüfer für dieses Tutorial waren Dave Gardner, Zack Jones, Teresa Murphy und Bernadette Leigh. Möchten Sie meine bevorstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter abmitchell@4GuysFromRolla.com.