CLS: Tipps & Tricks: ASP.Net



Tipps & Tricks: ASP.Net

Auf dieser Seite finden Sie 7 Tipps & Tricks für ASP.NET.

Wenn in den folgenden Erläuterungen Texte wie MsgBox formatiert sind, handelt es sich um konkret einzugebende Inhalte wie VBA-Code oder die Eingabe von Werten. Menüs wie Datei Speichern sind wie hier zu sehen formatiert. Schaltflächen oder Registerkarten auf Dialogen werden wie Menüs behandelt.

Alle Tipps sind nach bestem Wissen geprüft, aber selbstverständlich ohne Gewähr. Sollten Sie doch einen Fehler darin entdecken, würden wir uns freuen, wenn Sie uns per E-Mail Bescheid sagen.

Wenn Sie wissen wollen, mit welcher Software Ihre Seite gerade geöffnet wird, können Sie dies mit ASP.NET-Befehlen (wie übrigens auch rechts unten auf dieser Seite) ermitteln:

IP-Adresse: <%=Request.UserHostAddress.ToString()%><br />
Browser: <%=Request.Browser.Browser.ToString()%> <%=Request.Browser.Version.ToString() %><br />
JavaScript-Version: <%=Request.Browser.EcmaScriptVersion.ToString()%><br />
Betriebssystem: <%=Request.Browser.Platform.ToString()%><br />
Session-ID: <%=Page.Session.SessionID.ToString()%>

Im VBA-Code sind es die entsprechenden Befehle, die hier in HTML allerdings durch <%=...%> gekapselt sind.

Master ID 328

Jede Homepage/Site hat ein Grundgerüst mit Elementen, die auf jeder einzelnen Seite wiederholt werden, sei es das Logo, ein paar Impressumsdaten oder die Navigation. Selbstverständlich muss das nicht auf jeder Seite neu beschrieben werden, sondern dafür gibt es Master-Dateien. Sie beschreiben wesentliche Teile der Seite und lassen (beliebig viele) Platzhalter für die konkreten Details auf der Seite offen. Die einzelne Seite füllt dann nur noch die Platzhalter und der Server liefert beides gemischt an den Browser aus, der also gar nichts davon merkt.

Selbst kleinste Sites haben selbstverständlich eine Navigation, selbst wenn es oft nur ein paar häßliche blinkende Buttons in irgendeiner Ecke sind. Da der Aufwand zu ihrer Erstellung bei umfangreichen Homepages ganz erheblich ist und unnötig Zeit kostet, kann ASP.NET das "von Haus aus". Grundvoraussetzung dazu ist eine XML-Datei, die klassischerweise "web.sitemap" heißt und etwa so aussehen könnte:

web.sitemap
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="~/Home.aspx" title="Home" description="">
<siteMapNode url="" title="Unternehmen" description="Über CLS-Software">
<siteMapNode url="~/Philosophie.aspx" title="Philosophie" />
<siteMapNode url="~/Dienstleistungen.aspx" title="Dienstleistungen" />
</siteMapNode>
</siteMapNode>
</siteMapNode>
</siteMap>

Darin wird die Struktur der gesamten Site beschrieben, wobei es nur einen einzigen Startpunkt geben kann (um dieses Problem für ein Windows-artiges Menü mit mehreren Menütiteln als Startpunkte zu umgehen, siehe den Tipp "Navigation in der Seite (2): Menü"). Dieser heißt im obigen Beispiel Home und umschließt alle untergeordneten Knoten (siteMapNode), ist also ein zweiteiliges Tag mit Anfang (<siteMapNode ...>) und Ende (</siteMapNode>).

Im Gegensatz dazu stehen einteilige Tags, welche die unterste Ebene darstellen wie <siteMapNode url="~/Philospohie.aspx" />. Das ist übrigens ein Ausschnitt aus der tatsächlichen TreeView-Navigation hier links.

Die eigentliche Darstellung geschieht mit einem asp:TreeView wie im folgenden Beispiel, welches einer Masterdatei entnommen ist. Als Verbindung zu der Datei "web.sitemap" dient dabei ein asp:SiteMapDataSource-Element, auf welches asp:TreeView über die gleichnamige DataSourceID zugreifen kann:

Beispiel.master
...
die Datenquelle:
<asp:SiteMapDataSource ID="sitemap_CLS" runat="server" />
 
der TreeView:
<asp:TreeView ID="trvMenu" runat="server" DataSourceID="sitemap_CLS"
ImageSet="XPFileExplorer" NodeIndent="10" NodeWrap="True"
Width="250px" Height="200px"
>
<ParentNodeStyle Font-Bold="True" Font-Size="8pt" />
<HoverNodeStyle Font-Underline="True" ForeColor="#DD5555" Font-Italic="True" />
<SelectedNodeStyle Font-Underline="True" ForeColor="#DD5555"
HorizontalPadding="0px" VerticalPadding="0px" Font-Bold="false" />
<NodeStyle Font-Names="Verdana" Font-Size="8pt" ForeColor="Black"
HorizontalPadding="0px" NodeSpacing="0px" VerticalPadding="0px"
Height="8pt" Font-Bold="False" />
<RootNodeStyle Font-Bold="True" Font-Names="Arial" Font-Size="8pt" />
</asp:TreeView>

Zur Verdeutlichung sind hier wieder alle jene Elemente kursiv markiert, welche nur die Optik und nicht die Funktion betreffen. Damit ASP.NET "weiß", wie die XML-Datei "web.sitemap" zu verstehen ist, müssen Sie in "web.config" zusätzlich einen (Standard-)Provider für die Sitemap angeben:

web.config
<siteMap defaultProvider="XmlSiteMapProviderWeb" enabled="true">
<providers>
<clear/>
<add name="XmlSiteMapProviderWeb"
type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="Web.sitemap"/>
</providers>
</siteMap>

Neue Seiten in der Homepage werden nicht automatisch in "web.sitemap" aufgenommen, sondern müssen manuell integriert werden. Ein wenig lästig ist auch, dass es keine identischen url-Einträge in verschiedenen Knoten geben kann. Vorläufig unfertige Seiten der Hierarchie können also nicht auf eine einzige "Baustellen"-Seite umgelenkt werden.

Im Tipp "Navigation in der Seite (1): TreeView" wurde bereits darauf hingewiesen, dass es in "web.sitemap" nicht mehrere Startpunkte geben kann. Das wäre aber Voraussetzung für eine Menüstruktur, deren jeweilige Menütitel immer Startpunkt wären. Wie Sie beispielsweise auf www.SternenApotheke.de sehen können, ist es aber doch möglich. Der Trick besteht darin, mehrere Sitemap-Dateien zu haben.

web.config
<siteMap defaultProvider="XmlSiteMapProviderWeb" enabled="true">
<providers>
<clear/>
<add name="XmlSiteMapProviderWeb" ... siteMapFile="Web.sitemap"/>
<add name="XmlSiteMapProviderDatei" ... siteMapFile="Datei.sitemap"/>
<add name="XmlSiteMapProviderBearbeiten" ... siteMapFile="Bearbeiten.sitemap"/>
<add name="XmlSiteMapProviderAnsicht" ... siteMapFile="Ansicht.sitemap"/>
</providers>
</siteMap>

Die verschiedenen "*.sitemap"-Dateien entsprechen in Struktur und Aufbau der bereits oben gezeigten. In der Master-Datei müssen Sie entsprechend mehrere SiteMapDataSource-Elemente nennen:

Beispiel.master
<asp:SiteMapDataSource ID="SitemapDatei" runat="server" SiteMapProvider="XmlSiteMapProviderDatei" />
<asp:SiteMapDataSource ID="SiteMapBearbeiten" runat="server" SiteMapProvider="XmlSiteMapProviderBearbeiten" />
<asp:SiteMapDataSource ID="SitemapAnsicht" runat="server" SiteMapProvider="XmlSiteMapProviderAnsicht" />

Ebenfalls dort in der Master-Datei werden dann (in diesem Beispiel) drei asp:Menu-Elemente eingefügt, die jeweils auf eine eigene DataSourceID zugreifen:

Beispiel.master
<asp:Menu ID="menDatei" runat="server" DataSourceID="SiteMapDatei" >
</asp:Menu>
 
<asp:Menu ID="menBearbeiten" runat="server" DataSourceID="SiteMapBearbeiten" >
</asp:Menu>
 
<asp:Menu ID="menAnsicht" runat="server" DataSourceID="SiteMapAnsicht" BackColor="#F7F6F3" DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="1em" ForeColor="#7C6F57" StaticSubMenuIndent="10px" Orientation="Horizontal" AccessKey="A" StaticPopOutImageUrl="ClearPixel.gif" Height="15px">
<StaticMenuItemStyle Height="21px" />
<DynamicHoverStyle BackColor="CornflowerBlue" ForeColor="White" BorderStyle="Groove" BorderWidth="1px" />
<DynamicMenuStyle BackColor="Menu" BorderStyle="Groove" BorderWidth="1px"/>
<StaticSelectedStyle BackColor="MenuHighlight" BorderStyle="Groove" BorderWidth="1px"/>
<DynamicSelectedStyle BackColor="MenuHighlight" BorderStyle="Groove" BorderWidth="1px"/>
<DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" BorderStyle="Groove" BorderWidth="1px"/>
<StaticHoverStyle BackColor="CornflowerBlue" ForeColor="White" BorderStyle="Groove" BorderWidth="1px"/>
</asp:Menu>

Auch in diesem Beispiel wurden die nur der Optik dienenden Teile kursiv formatiert und für die ersten beiden Menüs ganz weggelassen.

Obwohl die TreeView- und Menü-Elemente die aktuell markierte Seite anzeigen, ist es oft hilfreich, den Pfad (wie hier im oberen Teil der Seite) anzuzeigen. Dazu gibt es das asp:SiteMapPath-Element:

Beispiel.master
Sie sind hier:
<asp:SiteMapPath ID="SiteMapPath1" runat="server" PathSeparator=" : "
Font-Size="8pt"Font-Names="Verdana">
<PathSeparatorStyle Font-Bold="True" ForeColor="#507CD1" />
<CurrentNodeStyle ForeColor="#333333" />
<NodeStyle Font-Bold="True" ForeColor="#284E98" />
<RootNodeStyle Font-Bold="True" ForeColor="#507CD1" />
</asp:SiteMapPath>

Für das asp:SiteMapPath-Element gelten die Voraussetzungen mit der Sitemap wie in den vorigen Beispielen. Vor allem funktioniert die Anzeige interessanterweise nur, wenn die aktuelle Seite auch Teil der Sitemap-Struktur ist.

Grundsätzlich sind Texte, die auf allen Seiten erscheinen sollen, natürlich in einem Master am besten aufgehoben. Dort erscheinen Sie immer an der gleichen Stelle oder vor/hinter dem eigentlichen Content. Was aber machen Sie, wenn bestimmte Textbausteine (oder Bilder oder alle anderen HTML-Tags) mitten im Content enthalten sein sollen und vielleicht auch nicht auf allen Seiten?

Die Lösung dazu heißt "Web-Benutzersteuerelement" (WebUserControl). Nach Website Neues Element hinzufügen wählen Sie im Dialog das Web-Benutzersteuerelement aus und geben ihm einen aussagekräftigen Namen wie Gewaehr.ascx. Dessen Inhalt könnte dann so aussehen:

<%@ Control Language="VB" AutoEventWireup="false"
CodeFile="Gewaehr.ascx.vb" Inherits="Gewaehr" %>
 
Alle Tipps sind nach bestem Wissen (<img src="smiley.gif">) geprüft, aber selbstverständlich ohne Gewähr. Sollten Sie doch einen Fehler darin finden usw. etc...

Diese Datei enthält alle möglichen Elemente einer HTML-Datei, aber keine <Body>-, <Title>-, <HTML>-Tags. Um diesen Inhalt in einer "normalen" ASP.NET-Seite zu benutzen, müssen Sie diese an deren Anfang zuerst deklarieren:

<%@ Page Language="VB" ... %>
<%@ Register Src="Gewaehr.ascx" TagPrefix="abc" TagName="Gewaehrleistung" %>
 
...
 
Im laufenden Text kommt jetzt der Hinweis. <abc:Gewaehrleistung ID="Hinweis1" runat="server" /> Danach folgt ein anderer Text.

Innerhalb des Textes erfolgt die Benutzung über TagPrefix und TagName, hier also abc:Gewaehrleistung, wobei beide Benennungen frei gewählt werden können. Das Benutzersteuerelement muss immer runat="server" enthalten. Änderungen an seinem Inhalt können jetzt immer zentral in der Datei "Gewaehr.ascx" erfolgen und gelten sofort für alle Seiten, die darauf zugreifen.

Wenn auf mehreren Seiten die gleiche Funktionalität (wie hier beispielsweise das Ein- und Ausklappen der Tipps) benötigt wird, sollten Sie deren Code zentral verwalten. Dazu braucht es (via Website Neues Element einfügen) ein Klassenmodul im Unterverzeichnis "App_Code"", welches hier "TippCode.vb" heißen soll. Diese noch leere Klasse sieht zuerst so aus:

TippCode.vb
Imports Microsoft.VisualBasic
 
Public Class TippCode
 
End Class

Da diese neue Klasse eine Page-Klasse ersetzen soll, müssen Sie zuerst deren Ereignisse integrieren (wie es auch im Original steht, etwa in "Default.aspx.vb"):

TippCode.vb
Imports Microsoft.VisualBasic
 
Public Class TippCode
Inherits System.Web.UI.Page
 
End Class

Innerhalb der Klasse können Sie nun beliebige Funktionen erstellen, die sich sowohl auf vorhandene Ereignisse als auch auf Eigenprogrammiertes beziehen können:

TippCode.vb
Imports Microsoft.VisualBasic
 
Public Class TippCode
Inherits System.Web.UI.Page
 
Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit
MsgBox("Das erscheint automatisch!")
'...hier der Code
End Sub
 
Sub ZeigeTest()
MsgBox("Test")
'...hier der Code
End Sub
End Class

In der jeweiligen Datei ersetzen Sie nun Inherits System.Web.UI.Page durch Inherits TippCode. Dann können Sie einen Button auf der Seite einfügen und in seinem Code die Prozedur ZeigeTest so aufrufen:

Default.aspx.vb oder ähnliche
Partial Class Default
Inherits TippCode
 
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
ZeigeTest()
End Sub
End Class

In jeder Seite, welche diese gemeinsame Funktionalität nutzen soll, rufen Sie den Code mit Inherits TippCode auf. Achtung: MsgBox-Befehle erscheinen möglicherweise nicht im vordersten Fenster. Wenn es auffallend lange dauert, sollten Sie mal in der Taskleiste nach längst erschienenen Meldungen im Hintergrund sehen.