Barrierefreie Webseiten mit ASP.NET 2.0 - Teil 4
Nun da die Menüs in die DemoSite eingebunden sind, sollten sie noch an eine Sitemap-Datei gebunden werden. Ich erstelle also die „web.sitemap“ mit den entsprechenden Einträgen im Root der Anwendung:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="<a href="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">http://schemas.microsoft.com/AspNet/SiteMap-File-1.0</a>" >
<siteMapNode url="." title="Root" description="Root">
<siteMapNode url="~/Default.aspx" title="Home" description="Startseite">
<siteMapNode url="~/Contact.aspx" title="Kontakt" description="Kontakt" />
<siteMapNode url="~/GuestBook.aspx" title="Gästebuch" description="Gästebuch" />
</siteMapNode>
<siteMapNode url="~/Products.aspx" title="Produkte" description="Produkte" />
<siteMapNode url="~/StyleGuide.aspx" title="Style Guide" description="Style Guide" />
</siteMapNode>
</siteMap>
Interessant ist, dass ich die Datei nicht in das Verzeichnis „App_Data“ legen kann, wo sie meiner Meinung nach hingehört. Ein eigener XmlSiteMapProvider würde das möglich machen. Der gegebene sucht die „web.sitemap“ zumindest im Root; findet er sie dort nicht, wird folgender Fehler erzeugt:
„System.InvalidOperationException: The file web.sitemap required by XmlSiteMapProvider does not exist.“
Nach längerem herumtüfteln, musste ich feststellen, dass ich für meine zwei normalen Menüebenen auch zwei SitemapDataSourcen benötige, da ich für die Menü Controls nicht die darzustellende Menüebene auswählen kann, sondern nur die Anzahl der darzustellenden Menüebenen. Bei den SitemapDataSourcen habe ich jedoch die Möglichkeit eine Startebene angeben. So kann ich für jedes Menü, über die entsprechende Datasource, eine andere Startebene wählen..
Die SitemapDataSourcen sind so eingebunden, dass der Root Node nicht angezeigt wird, für das erste Menü bei Ebene 0 (Da Root ausgeblendet ist, wird Ebene 1 zu Ebene 0 und Ebene 2 zu Ebene 1, usw.) gestartet wird und für das zweite Menü bei Ebene 1.
(Aus irgend einem Grund muss das Attribut „ShowStartingNode“ auf „False“ gesetzt werden, sonst wird auf jeder ebene nur ein Menüpunkt ausgegeben)
In den Menüs wird jeweils das Attribut „MaximumDynamicDisplayLevels“ auf „0“ gesetzt, da ich keine DHTML Menüs möchte und es wird die entsprechende „DatasourceId“ angegeben.
<asp:SiteMapDataSource
ID="SiteMapDataSource2"
runat="server"
ShowStartingNode="False"
StartingNodeOffset="1" />
<asp:Menu
ID="SubMenu"
runat="server"
MaximumDynamicDisplayLevels="0"
Orientation="Horizontal"
DataSourceID="SiteMapDataSource2">
<DataBindings>
<asp:MenuItemBinding
DataMember="SiteMapNode"
NavigateUrlField="Url"
TextField="Title"
ToolTipField="Description" />
</DataBindings>
</asp:Menu>
Weitere tolle Eigenschaften der SitemapDataSource sind, erstens dass diese die aktuelle Seite erkennt und das „Selected“ Attribut des entsprechenden MenuItems auf True setzt und zweitens können beide Menüs und SitemapDataSourcen auf der Masterpage platziert werden, denn anhand der aktuellen Seite bekommt das „SubMenu“ automatisch den richtigen Ast des Navigationsbaumes für die Ausgabe. Ich habe aus diesem Grund das „SubMenu“ nur in einen „ContentPlaceHolder“ gesetzt, um es auf Content-Seiten bei Bedarf ausblenden zu können.
Fazit bisher:
Es ist bis jetzt relativ einfach ohne ein Controls selber schreiben zu müssen eine Website nach aktuellen Standards zu erstellen. Bisher habe ich eine einzige Zeile Programmcode, nur um den Pfad des Seitenlogos zu generieren und an das Image Control für das Logo zu übergeben.
Vorschau:
Im Teil 5 werde ich mit Hilfe einer SqlDataSource, einer DetailsView und eines DataGrids ein einfaches Gästebuch in die DemoSite einbinden.
DemoSite ansehen
Teil 4 downloaden