Share via


Geschachtelte Masterseiten (VB)

von Scott Mitchell

Zeigt, wie eine master Seite in einer anderen geschachtelt wird.

Einführung

Im Verlauf der letzten neun Tutorials haben wir erfahren, wie sie ein websiteweites Layout mit master Seiten implementieren. Kurz gesagt, master Seiten ermöglichen es uns, dem Seitenentwickler, allgemeines Markup in der master Seite zusammen mit bestimmten Regionen zu definieren, die auf Inhaltsseitenbasis angepasst werden können. Die ContentPlaceHolder-Steuerelemente in einer master Seite geben die anpassbaren Bereiche an. Das angepasste Markup für die ContentPlaceHolder-Steuerelemente wird auf der Inhaltsseite über Inhaltssteuerelemente definiert.

Die master Seitentechniken, die wir bisher untersucht haben, sind hervorragend, wenn Sie ein einzelnes Layout haben, das auf der gesamten Website verwendet wird. Viele große Websites verfügen jedoch über ein Websitelayout, das in verschiedenen Abschnitten angepasst ist. Betrachten Sie beispielsweise eine Anwendung für das Gesundheitswesen, die vom Krankenhauspersonal verwendet wird, um Patienteninformationen, Aktivitäten und Abrechnungen zu verwalten. Es kann drei Arten von Webseiten in dieser Anwendung geben:

  • Mitarbeiterspezifische Seiten, auf denen Mitarbeiter die Verfügbarkeit aktualisieren, Zeitpläne anzeigen oder Urlaubszeit anfordern können.
  • Patientenspezifische Seiten, auf denen Mitarbeiter Informationen für einen bestimmten Patienten anzeigen oder bearbeiten.
  • Abrechnungsspezifische Seiten, auf denen Buchhalter aktuelle Anspruchsstatus und Finanzberichte überprüfen.

Jede Seite kann ein gemeinsames Layout verwenden, z. B. ein Menü oben und eine Reihe häufig verwendeter Links am unteren Rand. Die mitarbeiter-, patienten- und abrechnungsspezifischen Seiten müssen dieses generische Layout jedoch möglicherweise anpassen. Beispielsweise sollten alle mitarbeiterspezifischen Seiten einen Kalender und eine Aufgabenliste enthalten, in der die Verfügbarkeit und der Tageszeitplan des aktuell angemeldeten Benutzers angezeigt werden. Möglicherweise müssen alle patientenspezifischen Seiten den Namen, die Adresse und die Versicherungsinformationen für den Patienten anzeigen, dessen Informationen bearbeitet werden.

Es ist möglich, solche angepassten Layouts mithilfe von geschachtelten master Seiten zu erstellen. Um das obige Szenario zu implementieren, erstellen wir zunächst eine master Seite, die das websiteweite Layout, das Menü und den Fußzeileninhalt definiert, wobei ContentPlaceHolders die anpassbaren Bereiche definiert. Anschließend würden wir drei geschachtelte master Seiten erstellen, eine für jeden Webseitentyp. Jede geschachtelte master Seite würde den Inhalt der Inhaltsseiten definieren, die die master Seite verwenden. Anders ausgedrückt: Die geschachtelte master Seite für patientenspezifische Inhaltsseiten würde Markup und programmgesteuerte Logik zum Anzeigen von Informationen über den zu bearbeitenden Patienten enthalten. Beim Erstellen einer neuen patientenspezifischen Seite binden wir sie an diese geschachtelte master Seite.

In diesem Tutorial werden zunächst die Vorteile geschachtelter master Seiten hervorgehoben. Anschließend wird gezeigt, wie geschachtelte master Seiten erstellt und verwendet werden.

Hinweis

Geschachtelte master Seiten sind seit Version 2.0 der .NET Framework möglich. Visual Studio 2005 enthielt jedoch keine Entwurfszeitunterstützung für geschachtelte master Seiten. Die gute Nachricht ist, dass Visual Studio 2008 eine umfassende Entwurfszeiterfahrung für geschachtelte master Seiten bietet. Wenn Sie an der Verwendung geschachtelter master Seiten interessiert sind, aber weiterhin Visual Studio 2005 verwenden, lesen Sie scott Guthries Blogbeitrag Tipps für geschachtelte Gestaltungsvorlagen in VS 2005 Design-Time.

Die Vorteile geschachtelter Gestaltungsvorlagen

Viele Websites verfügen über ein übergreifendes Websitedesign sowie maßgeschneiderte Designs, die für bestimmte Arten von Seiten spezifisch sind. Für instance haben wir in unserer Demo-Webanwendung einen rudimentären Verwaltungsabschnitt (die Seiten im ~/Admin Ordner) erstellt. Derzeit verwenden die Webseiten im ~/Admin Ordner dieselbe master Seite wie die Seiten, die sich nicht im Verwaltungsabschnitt befinden (oder Site.masterAlternate.master, je nach Auswahl des Benutzers).

Hinweis

Geben Sie vorerst vor, dass unsere Website nur eine master Seite hat, Site.master. Die Verwendung geschachtelter master Seiten mit zwei (oder mehr) master Seiten beginnen mit "Verwenden einer geschachtelten Gestaltungsvorlage für den Verwaltungsabschnitt" weiter unten in diesem Tutorial.

Angenommen, wir wurden aufgefordert, das Layout der Verwaltungsseiten so anzupassen, dass zusätzliche Informationen oder Links enthalten sind, die andernfalls auf anderen Seiten der Website nicht vorhanden wären. Es gibt vier Techniken, um diese Anforderung zu implementieren:

  1. Fügen Sie manuell die verwaltungsspezifischen Informationen und Links zu jeder Inhaltsseite im ~/Admin Ordner hinzu.
  2. Aktualisieren Sie die Site.master Seite master so, dass sie die spezifischen Informationen und Links für den Abschnitt Verwaltung enthält, und fügen Sie dann code zur seite master hinzu, um diese Abschnitte anzuzeigen oder auszublenden, je nachdem, ob eine der Verwaltungsseiten besucht wird.
  3. Erstellen Sie eine neue master Seite speziell für den Abschnitt Verwaltung, kopieren Sie das Markup ausSite.master, fügen Sie die spezifischen Informationen und Links für den Abschnitt Verwaltung hinzu, und aktualisieren Sie dann die Inhaltsseiten im ~/Admin Ordner, um diese neue master Seite zu verwenden.
  4. Erstellen Sie eine geschachtelte master Seite, die an Site.master gebunden ist, und verwenden Sie diese neue geschachtelte master-Seite, um die Inhaltsseiten im ~/Admin Ordner zu verwenden. Diese geschachtelte master Seite würde nur die zusätzlichen Informationen und Links enthalten, die speziell für die Verwaltungsseiten gelten, und das bereits in Site.masterdefinierte Markup muss nicht wiederholt werden.

Die erste Option ist die am wenigsten schmackhafte. Der ganze Sinn der Verwendung von master Seiten besteht darin, nicht mehr das manuelle Kopieren und Einfügen von allgemeinem Markup in neue ASP.NET Seiten zu verschieben. Die zweite Option ist akzeptabel, macht die Anwendung jedoch weniger verwaltbar, da sie die master Seiten mit Markup massent, die nur gelegentlich angezeigt wird, und erfordert, dass Entwickler, die die master Seite bearbeiten, dieses Markup umgehen und sich merken müssen, wann genau bestimmtes Markup angezeigt wird und wann es ausgeblendet ist. Dieser Ansatz wäre weniger haltbar, da Anpassungen von immer mehr Webseitentypen von dieser einzelnen master Seite berücksichtigt werden müssen.

Die dritte Option entfernt die Unordnungs- und Komplexitätsprobleme, die mit der zweiten Option angezeigt werden. Der Standard Nachteil von Option 3 besteht jedoch darin, dass wir das allgemeine Layout aus kopieren und auf Site.master die neue seite administration-spezifische master einfügen müssen. Wenn wir uns später dazu entscheiden, das websiteweite Layout zu ändern, müssen wir daran denken, es an zwei Stellen zu ändern.

Die vierte Option, geschachtelt master Seiten, gibt uns das Beste aus der zweiten und dritten Option. Die websiteweiten Layoutinformationen werden in einer Datei - der obersten Master -Seite verwaltet, während der für bestimmte Regionen spezifische Inhalt in verschiedene Dateien aufgeteilt wird.

Dieses Tutorial beginnt mit dem Erstellen und Verwenden einer einfachen geschachtelten master Seite. Wir erstellen eine brandneue master-Seite auf oberster Ebene, zwei geschachtelte master Seiten und zwei Inhaltsseiten. Ab "Verwenden einer geschachtelten Gestaltungsvorlage für den Verwaltungsabschnitt" wird die vorhandene master Seitenarchitektur aktualisiert, um geschachtelte master Seiten zu verwenden. Insbesondere erstellen wir eine geschachtelte master Seite und verwenden sie, um zusätzliche benutzerdefinierte Inhalte für die Inhaltsseiten im ~/Admin Ordner einzuschließen.

Schritt 1: Erstellen einer einfachen Top-Level Gestaltungsvorlage

Das Erstellen eines geschachtelten master basierend auf einer der vorhandenen master-Seiten und das anschließende Aktualisieren einer vorhandenen Inhaltsseite, um diese neue geschachtelte master Seite anstelle der seite der obersten Ebene master zu verwenden, ist mit einer gewissen Komplexität verbunden, da die vorhandenen Inhaltsseiten bereits bestimmte ContentPlaceHolder-Steuerelemente erwarten, die in der master-Seite der obersten Ebene definiert sind. Daher muss die geschachtelte master Seite auch die gleichen ContentPlaceHolder-Steuerelemente mit denselben Namen enthalten. Darüber hinaus verfügt unsere spezielle Demoanwendung über zwei master Seiten (Site.master und Alternate.master), die einer Inhaltsseite dynamisch basierend auf den Vorlieben eines Benutzers zugewiesen werden, was diese Komplexität noch erhöht. Weiter unten in diesem Tutorial wird die Aktualisierung der vorhandenen Anwendung zur Verwendung geschachtelter master Seiten erläutert. Konzentrieren wir uns jedoch zunächst auf ein einfaches Beispiel für geschachtelte master Seiten.

Erstellen Sie einen neuen Ordner namensNestedMasterPages, und fügen Sie dann dem Ordner eine neue master-Seitendatei mit dem Namen Simple.masterhinzu. (Einen Screenshot des Projektmappen-Explorer nach dem Hinzufügen dieses Ordners und dieser Datei finden Sie in Abbildung 1.) Ziehen Sie die AlternateStyles.css Stylesheetdatei aus dem Projektmappen-Explorer auf die Designer. Dadurch wird der Stylesheetdatei im <head> -Element ein <link> -Element hinzugefügt, nach dem das Markup der master Seite <head> wie folgt aussehen sollte:

<head runat="server"> 
 <title>Untitled Page</title> 
 <asp:ContentPlaceHolder id="head" runat="server"> 
 </asp:ContentPlaceHolder>
 <link href="../AlternateStyles.css" rel="stylesheet" type="text/css" /> 
</head>

Fügen Sie als Nächstes das folgende Markup im Webformular von hinzu Simple.master:

<div id="topContent"> 
 <asp:HyperLink ID="lnkHome" runat="server" 
 NavigateUrl="~/NestedMasterPages/Default.aspx" 
 Text="Nested Master Pages Tutorial (Simple)" /> 
</div> 
<div id="mainContent"> 
 <asp:ContentPlaceHolder id="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
</div>

Dieses Markup zeigt oben auf der Seite einen Link mit dem Titel "Geschachtelte Gestaltungsvorlagen (Einfach)" in einer großen weißen Schriftart auf einem marinen Hintergrund an. Darunter befindet sich der MainContent ContentPlaceHolder. Abbildung 1 zeigt die Simple.master master Seite, wenn sie in die Visual Studio-Designer geladen wird.

Die Seite

Abbildung 01: Die geschachtelte Gestaltungsvorlage definiert inhaltespezifisch für die Seiten im Abschnitt Verwaltung (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 2: Erstellen einer einfachen geschachtelten Gestaltungsvorlage

Simple.master enthält zwei ContentPlaceHolder-Steuerelemente: den MainContent ContentPlaceHolder, den wir innerhalb des Webformulars hinzugefügt haben, zusammen mit dem head ContentPlaceHolder im <head> -Element. Wenn wir eine Inhaltsseite erstellen und an Simple.master die Inhaltsseite binden würden, hätten wir zwei Inhaltssteuerelemente, die auf die beiden ContentPlaceHolders verweisen. Wenn wir eine geschachtelte master Seite erstellen und an Simple.master diese binden, verfügt die geschachtelte master Seite über zwei Inhaltssteuerelemente.

Fügen Wir dem Ordner eine neue geschachtelte master Seite mit dem NestedMasterPages Namen SimpleNested.masterhinzu. Klicken Sie mit der rechten Maustaste auf den NestedMasterPages Ordner, und wählen Sie Neues Element hinzufügen aus. Dadurch wird das In Abbildung 2 gezeigte Dialogfeld Neues Element hinzufügen angezeigt. Wählen Sie den Vorlagentyp Gestaltungsvorlage aus, und geben Sie den Namen der neuen seite master ein. Aktivieren Sie das Kontrollkästchen "Seite master auswählen", um anzugeben, dass es sich bei der neuen seite master um eine geschachtelte master Seite handeln soll.

Klicken Sie als Nächstes auf die Schaltfläche Hinzufügen. Dadurch wird das gleiche Dialogfeld Gestaltungsvorlage auswählen angezeigt, das Beim Binden einer Inhaltsseite an eine master Seite angezeigt wird (siehe Abbildung 3). Wählen Sie die Simple.master seite master im Ordner aus, NestedMasterPages und klicken Sie auf OK.

Hinweis

Wenn Sie Ihre ASP.NET Website mithilfe des Webanwendungsprojektmodells anstelle des Websiteprojektmodells erstellt haben, wird das Kontrollkästchen "Seite master auswählen" im Dialogfeld Neues Element hinzufügen in Abbildung 2 nicht angezeigt. Um bei Verwendung des Webanwendungsprojektmodells eine geschachtelte master Seite zu erstellen, müssen Sie die Vorlage geschachtelte Gestaltungsvorlage (anstelle der Gestaltungsvorlage) auswählen. Nachdem Sie die Vorlage geschachtelte Gestaltungsvorlage ausgewählt und auf Hinzufügen geklickt haben, wird das in Abbildung 3 gezeigte Dialogfeld Gestaltungsvorlage auswählen angezeigt.

Aktivieren Sie das Kontrollkästchen

Abbildung 02: Aktivieren Sie das Kontrollkästchen "Master Seite auswählen", um eine geschachtelte Gestaltungsvorlage hinzuzufügen (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Binden Sie die geschachtelte Gestaltungsvorlage an simple. master Gestaltungsvorlage

Abbildung 03: Binden der geschachtelten Gestaltungsvorlage an die Gestaltungsvorlage Simple.master (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Das unten gezeigte deklarative Markup der geschachtelten master Seite enthält zwei Content-Steuerelemente, die auf die beiden ContentPlaceHolder-Steuerelemente der obersten ebene master Seite verweisen.

<%@ Master Language="VB" MasterPageFile="~/NestedMasterPages/Simple.master" AutoEventWireup="false" CodeFile="SimpleNested.master.vb" Inherits="NestedMasterPages_SimpleNested" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 </asp:Content>

Mit Ausnahme der <%@ Master %> -Direktive ist das anfängliche deklarative Markup der geschachtelten master Seite identisch mit dem Markup, das ursprünglich generiert wird, wenn eine Inhaltsseite an dieselbe master Seite der obersten Ebene gebunden wird. Wie die -Direktive einer Inhaltsseite <%@ Page %> enthält die <%@ Master %> -Direktive hier ein MasterPageFile -Attribut, das die geschachtelte master übergeordnete master Seite angibt. Der Standard Unterschied zwischen der geschachtelten master-Seite und einer Inhaltsseite, die an dieselbe master Seite der obersten Ebene gebunden ist, besteht darin, dass die geschachtelte master Seite ContentPlaceHolder-Steuerelemente enthalten kann. Die contentPlaceHolder-Steuerelemente der geschachtelten master Seite definieren die Bereiche, in denen die Inhaltsseiten das Markup anpassen können.

Aktualisieren Sie diese geschachtelte master Seite, sodass der Text "Hello, from SimpleNested!" im Content-Steuerelement angezeigt wird, das dem MainContent ContentPlaceHolder-Steuerelement entspricht.

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 <p>Hello, from SimpleNested!</p>
</asp:Content>

Nachdem Sie diese Ergänzung gemacht haben, speichern Sie die geschachtelte master Seite, fügen Sie dem Ordner eine neue Inhaltsseite mit dem NestedMasterPages Namen Default.aspxhinzu, und binden Sie sie an die SimpleNested.master seite master. Wenn Sie diese Seite hinzufügen, werden Sie vielleicht überrascht sein, dass sie keine Inhaltssteuerelemente enthält (siehe Abbildung 4)! Eine Inhaltsseite kann nur auf die übergeordneten master ContentPlaceHolders der Seite zugreifen. SimpleNested.masterenthält keine ContentPlaceHolder-Steuerelemente; Daher können an diese master Seite gebundene Inhaltsseiten keine Inhaltssteuerelemente enthalten.

Die Seite

Abbildung 04: Die Neue Inhaltsseite enthält keine Inhaltssteuerelemente (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Wir müssen die geschachtelte master Seite (SimpleNested.master) aktualisieren, um ContentPlaceHolder-Steuerelemente einzuschließen. In der Regel möchten Sie, dass Ihre geschachtelten master Seiten einen ContentPlaceHolder für jeden ContentPlaceHolder enthalten, der durch seine übergeordnete master Seite definiert wird, sodass die untergeordnete master Seite oder Inhaltsseite mit jedem der ContentPlaceHolder-Steuerelemente der obersten ebene master Seite verwendet werden kann.

Aktualisieren Sie die SimpleNested.master seite master, um einen ContentPlaceHolder in die beiden Content-Steuerelemente einzuschließen. Geben Sie den ContentPlaceHolder-Steuerelementen den gleichen Namen wie das ContentPlaceHolder-Steuerelement, auf das sich das Content-Steuerelement bezieht. Das heißt, fügen Sie dem Content-Steuerelement in SimpleNested.master ein ContentPlaceHolder-Steuerelement mit dem Namen MainContent hinzu, das auf den MainContent ContentPlaceHolder in Simple.masterverweist. Führen Sie die gleiche Vorgehensweise im Inhaltssteuerelement aus, das auf den head ContentPlaceHolder verweist.

Hinweis

Obwohl ich empfehle, die ContentPlaceHolder-Steuerelemente auf der geschachtelten master Seite genauso wie die ContentPlaceHolders auf der seite der obersten ebene master zu benennen, ist diese Benennungssymmetrie nicht erforderlich. Sie können den ContentPlaceHolder-Steuerelementen in Ihrer geschachtelten master Seite einen beliebigen Namen geben. Ich finde es jedoch einfacher, sich zu merken, welche ContentPlaceHolders mit welchen Bereichen der Seite übereinstimmen, wenn meine master-Seite der obersten Ebene und geschachtelte master Seiten die gleichen Namen verwenden.

Nachdem Sie diese Ergänzungen vornehmen, sollte das deklarative Markup ihrer SimpleNested.master master Seite wie folgt aussehen:

<%@ Master Language="VB" MasterPageFile="~/NestedMasterPages/Simple.master" AutoEventWireup="false" CodeFile="SimpleNested.master.vb" Inherits="NestedMasterPages_SimpleNested" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
 <asp:ContentPlaceHolder ID="head" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 <p>Hello, from SimpleNested!</p>
 <asp:ContentPlaceHolder ID="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content>

Löschen Sie die Default.aspx soeben erstellte Inhaltsseite, und fügen Sie sie dann erneut hinzu, und binden Sie sie an die SimpleNested.master seite master. Dieses Mal fügt Visual Studio zwei Content-Steuerelemente zu hinzu, die Default.aspxauf die contentPlaceHolders verweisen, die jetzt in SimpleNested.master definiert sind (siehe Abbildung 6). Fügen Sie den Text "Hello, from Default.aspx!" im Inhaltssteuerelement hinzu, auf das verwiesen wurde MainContent.

Abbildung 5 zeigt die drei hier beteiligten Entitäten - Simple.master, SimpleNested.masterund Default.aspx - und wie sie miteinander in Beziehung stehen. Wie das Diagramm zeigt, implementiert die geschachtelte master Seite Inhaltssteuerelemente für den ContentPlaceHolder des übergeordneten Elements. Wenn auf diese Bereiche für die Inhaltsseite zugegriffen werden muss, muss die geschachtelte master Seite den Inhaltssteuerelementen eigene ContentPlaceHolders hinzufügen.

Die Top-Level und geschachtelten Gestaltungsvorlagen diktieren das Layout der Inhaltsseite.

Abbildung 05: Die Top-Level und geschachtelten Gestaltungsvorlagen diktieren das Layout der Inhaltsseite (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Dieses Verhalten veranschaulicht, wie eine Inhaltsseite oder master Seite nur die übergeordnete master Seite erkennt. Dieses Verhalten wird auch durch die Visual Studio-Designer angegeben. Abbildung 6 zeigt die Designer für Default.aspx. Die Designer zeigt zwar deutlich an, welche Bereiche von der Inhaltsseite aus bearbeitet werden können und welche Nichtabschnitte nicht, aber es gibt keine Eindeutigkeit, welche nicht bearbeitbaren Bereiche auf der geschachtelten master Seite und welche Regionen von der seite der obersten Ebene master sind.

Die Inhaltsseite enthält jetzt Inhaltssteuerelemente für die ContentPlaceHolder der geschachtelten Gestaltungsvorlage.

Abbildung 06: Die Inhaltsseite enthält jetzt Inhaltssteuerelemente für die ContentPlaceHolders der geschachtelten Gestaltungsvorlage (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 3: Hinzufügen einer zweiten einfachen geschachtelten Gestaltungsvorlage

Der Vorteil geschachtelter master Seiten ist deutlicher, wenn mehrere geschachtelte master Seiten vorhanden sind. Um diesen Vorteil zu veranschaulichen, erstellen Sie eine weitere geschachtelte master Seite im NestedMasterPages Ordner. Benennen Sie diese neue geschachtelte master SeiteSimpleNestedAlternate.master, und binden Sie sie an die Simple.master seite master. Fügen Sie contentPlaceHolder-Steuerelemente wie in Schritt 2 den beiden inhaltsbezogenen Steuerelementen der geschachtelten master Seite hinzu. Fügen Sie außerdem den Text "Hello, from SimpleNestedAlternate!" im Inhaltssteuerelement hinzu, der dem ContentPlaceHolder der obersten ebene master Seite MainContent entspricht. Nachdem Sie diese Änderungen vorgenommen haben, sollte das deklarative Markup Ihrer neuen geschachtelten master Seite wie folgt aussehen:

<%@ Master Language="VB" MasterPageFile="~/NestedMasterPages/Simple.master" AutoEventWireup="false" CodeFile="SimpleNestedAlternate.master.vb" Inherits="NestedMasterPages_SimpleNestedAlternate" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
 <asp:ContentPlaceHolder ID="head" runat="server">
 </asp:ContentPlaceHolder> </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
 <p>Hello, from SimpleNestedAlternate!</p> 
 <asp:ContentPlaceHolder ID="MainContent" runat="server">
 </asp:ContentPlaceHolder> 
 </asp:Content>

Erstellen Sie eine Inhaltsseite namens Alternate.aspx im NestedMasterPages Ordner, und binden Sie sie an die SimpleNestedAlternate.master geschachtelte master Seite. Fügen Sie dem Inhaltssteuerelement den Text "Hello, from Alternate!" hinzu, der entspricht MainContent. Abbildung 7 zeigtAlternate.aspx, wenn es über die Visual Studio-Designer angezeigt wird.

Alternate.aspx ist an SimpleNestedAlternate gebunden. master Gestaltungsvorlage

Abbildung 07: Alternate.aspx Ist an die Gestaltungsvorlage SimpleNestedAlternate.master gebunden (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Vergleichen Sie die Designer in Abbildung 7 mit dem Designer in Abbildung 6. Beide Inhaltsseiten teilen sich das gleiche Layout, das in der obersten master Seite (Simple.master) definiert ist, nämlich den Titel "Tutorial für geschachtelte Gestaltungsvorlagen (einfach)". Beide haben jedoch unterschiedliche Inhalte, die in ihren übergeordneten master Seiten definiert sind– den Text "Hello, from SimpleNested!" in Abbildung 6 und "Hello, from SimpleNestedAlternate!" in Abbildung 7. Zugegeben, diese Unterschiede sind hier trivial, aber Sie können dieses Beispiel erweitern, um aussagekräftigere Unterschiede einzuschließen. Für instance kann die Seite ein Menü mit Optionen enthalten, die SimpleNested.master für ihre Inhaltsseiten spezifisch sind, während SimpleNestedAlternate.master informationen vorhanden sein können, die für die Inhaltsseiten relevant sind, die an sie gebunden sind.

Stellen Sie sich nun vor, wir müssten eine Änderung am übergreifenden Websitelayout vornehmen. Stellen Sie sich beispielsweise vor, dass wir eine Liste mit allgemeinen Links zu allen Inhaltsseiten hinzufügen möchten. Um dies zu erreichen, aktualisieren wir die Seite der obersten ebene master, Simple.master. Alle Dort vorgenommenen Änderungen werden sofort in den geschachtelten master Seiten und, als Erweiterung, deren Inhaltsseiten widergespiegelt.

Öffnen Sie die Seite master, und fügen Sie das Simple.master folgende Markup zwischen den topContent Elementen und mainContent<div> hinzu, um zu veranschaulichen, wie einfach wir das übergeordnete Websitelayout ändern können:

<div id="navContent"> 
 <asp:HyperLink ID="lnkDefault" runat="server" 
 NavigateUrl="~/NestedMasterPages/Default.aspx" 
 Text="Nested Master Page Example 1" /> 
 | 
 <asp:HyperLink ID="lnkAlternate" runat="server" 
 NavigateUrl="~/NestedMasterPages/Alternate.aspx" 
 Text="Nested Master Page Example 2" /> 
</div>

Dadurch werden oben auf jeder Seite, die an Simple.master, SimpleNested.masteroder SimpleNestedAlternate.mastergebunden ist, zwei Links hinzugefügt. Diese Änderungen gelten sofort für alle geschachtelten master-Seiten und deren Inhaltsseiten. Abbildung 8 zeigt Alternate.aspx , wenn es über einen Browser angezeigt wird. Beachten Sie das Hinzufügen der Links oben auf der Seite (im Vergleich zu Abbildung 7).

Geändert in die Top-Level Gestaltungsvorlage wird sofort in den geschachtelten Gestaltungsvorlagen und deren Inhaltsseiten widergespiegelt

Abbildung 08: Geändert in die Top-Level Gestaltungsvorlage wird sofort in den geschachtelten Gestaltungsvorlagen und deren Inhaltsseiten reflektiert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Verwenden einer geschachtelten Gestaltungsvorlage für den Verwaltungsabschnitt

An diesem Punkt haben wir die Vorteile geschachtelter master Seiten untersucht und erfahren, wie sie in einer ASP.NET-Anwendung erstellt und verwendet werden können. Die Beispiele in den Schritten 1, 2 und 3 umfassten jedoch das Erstellen einer neuen master-Seite der obersten Ebene, neue geschachtelte master-Seiten und neue Inhaltsseiten. Wie sieht es mit dem Hinzufügen einer neuen geschachtelten master-Seite zu einer Website mit einer vorhandenen master-Seite und Inhaltsseiten der obersten Ebene aus?

Das Integrieren einer geschachtelten master-Seite in eine vorhandene Website und das Zuordnen dieser Seite mit vorhandenen Inhaltsseiten erfordert etwas mehr Aufwand, als von Grund auf neu zu beginnen. Die Schritte 4, 5, 6 und 7 untersuchen diese Herausforderungen, während wir unsere Demoanwendung erweitern, um eine neue geschachtelte master Seite namens einzuschließenAdminNested.master, die Anweisungen für den Administrator enthält und von den ASP.NET Seiten im ~/Admin Ordner verwendet wird.

Die Integration einer geschachtelten master Seite in unsere Demoanwendung führt zu den folgenden Hürden:

  • Die vorhandenen Inhaltsseiten im ~/Admin Ordner haben bestimmte Erwartungen an ihre master Seite. Zunächst wird erwartet, dass bestimmte ContentPlaceHolder-Steuerelemente vorhanden sind. Darüber hinaus rufen die ~/Admin/AddProduct.aspx Seiten und ~/Admin/Products.aspx die öffentliche RefreshRecentProductsGrid Methode der master Seite auf, legen die GridMessageText -Eigenschaft fest oder verfügen über einen Ereignishandler für das PricesDoubled -Ereignis. Daher muss unsere geschachtelte master-Seite dieselben ContentPlaceHolders und öffentlichen Member enthalten.
  • Im vorherigen Tutorial haben wir die BasePage -Klasse verbessert, um die Page Eigenschaft des MasterPageFile Objekts basierend auf einer Session-Variablen dynamisch festzulegen. Wie unterstützen wir dynamische master-Seiten, wenn geschachtelte master Seiten verwendet werden?

Diese beiden Herausforderungen treten auf, wenn wir die geschachtelte master Seite erstellen und auf unseren vorhandenen Inhaltsseiten verwenden. Wir untersuchen und beheben diese Probleme, sobald sie auftreten.

Schritt 4: Erstellen der geschachtelten Gestaltungsvorlage

Unsere erste Aufgabe besteht darin, die geschachtelte master Seite zu erstellen, die von den Seiten im Abschnitt Verwaltung verwendet werden soll. Wie in Schritt 2 gesehen, müssen wir beim Hinzufügen einer neuen geschachtelten master Seite die geschachtelte master übergeordnete master Seite angeben. Wir haben jedoch zwei master Seiten der obersten Ebene: Site.master und Alternate.master. Denken Sie daran, dass wir im vorherigen Tutorial erstellt Alternate.master und Code in der BasePage -Klasse geschrieben haben, die die Page Eigenschaft des MasterPageFile Objekts zur Laufzeit entweder auf Site.master oder Alternate.master abhängig vom Wert der MyMasterPage Sitzungsvariablen festgelegt hat.

Wie konfigurieren wir unsere geschachtelte master Seite so, dass sie die entsprechende master-Seite der obersten Ebene verwendet? Es gibt zwei Möglichkeiten:

  • Erstellen Sie zwei geschachtelte master Seiten und AdminNestedSite.masterAdminNestedAlternate.master, und binden Sie sie an die obersten master Seiten Site.master bzwAlternate.master. . In BasePagelegen Sie dann das Page -Objekt MasterPageFile auf die entsprechende geschachtelte master Seite fest.
  • Erstellen Sie eine einzelne geschachtelte master Seite, und lassen Sie die Inhaltsseiten diese spezielle master Seite verwenden. Anschließend müssen wir zur Laufzeit die geschachtelte master-Seite-Eigenschaft MasterPageFile auf die entsprechende master Seite der obersten Ebene zur Laufzeit festlegen. (Wie Sie vielleicht bereits herausgefunden haben, verfügen master Seiten auch über eine MasterPageFile -Eigenschaft.)

Verwenden wir die zweite Option. Erstellen Sie eine einzelne geschachtelte master Seitendatei im Ordner mit dem ~/Admin Namen AdminNested.master. Da sowohl als auch Site.masterAlternate.master über denselben Satz von ContentPlaceHolder-Steuerelementen verfügen, spielt es keine Rolle, an welche master Seite Sie sie binden, obwohl ich Sie ermuntern, sie aus Gründen der Konsistenz an Site.master zu binden.

Fügen Sie dem Ordner ~/Admin eine geschachtelte Gestaltungsvorlage hinzu.

Abbildung 09: Hinzufügen einer geschachtelten Gestaltungsvorlage ~/Admin zum Ordner. (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Da die geschachtelte master Seite an eine master Seite mit vier ContentPlaceHolder-Steuerelementen gebunden ist, fügt Visual Studio dem ursprünglichen Markup der neuen geschachtelten master Seitendatei vier Inhaltssteuerelemente hinzu. Fügen Sie, wie in den Schritten 2 und 3, in jedem Content-Steuerelement ein ContentPlaceHolder-Steuerelement hinzu, und geben Sie ihm den gleichen Namen wie das ContentPlaceHolder-Steuerelement der obersten ebene master Seite. Fügen Sie außerdem das folgende Markup dem Content-Steuerelement hinzu, das dem MainContent ContentPlaceHolder entspricht:

<div class="instructions"> 
 <b>Administration Instructions:</b>
 <br /> 
 The pages in the Administration section allow you, the Administrator, to 
 add new products and view existing products. 
</div>

Definieren Sie als Nächstes die instructions CSS-Klasse in den Styles.css CSS-Dateien und AlternateStyles.css . Die folgenden CSS-Regeln bewirken, dass HTML-Elemente, die mit der instructions -Klasse formatiert sind, mit einer hellgelben Hintergrundfarbe und einem schwarzen, durchgezogenen Rahmen angezeigt werden:

.instructions 
{
 padding: 6px; 
 border: dashed 1px black; 
 background-color: #ffb; 
 margin-bottom: 10px; 
}

Da dieses Markup der geschachtelten seite master hinzugefügt wurde, wird es nur auf den Seiten angezeigt, die diese geschachtelte master Seite verwenden (nämlich die Seiten im Abschnitt Verwaltung).

Nachdem Sie diese Ergänzungen zur Seite geschachtelt master gemacht haben, sollte das deklarative Markup wie folgt aussehen:

<%@ Master Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="AdminNested.master.vb" Inherits="Admin_AdminNested" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
 <asp:ContentPlaceHolder ID="head" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 <div class="instructions">
 <b>Administration Instructions:</b>
 <br /> 
 The pages in the Administration section allow you, the Administrator, to 
 add new products and view existing products. 
 </div>
 <asp:ContentPlaceHolder ID="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content3" ContentPlaceHolderID="QuickLoginUI" Runat="Server"> 
 <asp:ContentPlaceHolder ID="QuickLoginUI" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content4" ContentPlaceHolderID="LeftColumnContent" Runat="Server"> 
 <asp:ContentPlaceHolder ID="LeftColumnContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content>

Beachten Sie, dass jedes Content-Steuerelement über ein ContentPlaceHolder-Steuerelement verfügt und dass den Eigenschaften von ContentPlaceHolder-Steuerelementen ID die gleichen Werte wie den entsprechenden ContentPlaceHolder-Steuerelementen auf der obersten Ebene master Seite zugewiesen werden. Darüber hinaus wird das spezifische Markup für den MainContent Abschnitt Verwaltung im ContentPlaceHolder angezeigt.

Abbildung 10 zeigt die AdminNested.master geschachtelte master Seite, wenn sie über die Designer von Visual Studio angezeigt wird. Die Anweisungen werden im gelben Feld oben MainContent im Inhaltssteuerelement angezeigt.

Die geschachtelte Gestaltungsvorlage erweitert die Top-Level Gestaltungsvorlage um Anweisungen für den Administrator.

Abbildung 10: Die geschachtelte Gestaltungsvorlage erweitert die Top-Level Gestaltungsvorlage, um Anweisungen für den Administrator einzuschließen. (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 5: Aktualisieren der vorhandenen Inhaltsseiten für die Verwendung der neuen geschachtelten Gestaltungsvorlage

Wenn wir dem Abschnitt Verwaltung eine neue Inhaltsseite hinzufügen, müssen wir sie an die master Seite binden, die AdminNested.master wir gerade erstellt haben. Aber was ist mit den vorhandenen Inhaltsseiten? Derzeit leiten alle Inhaltsseiten auf der Website von der BasePage -Klasse ab, die programmgesteuert die master Seite der Inhaltsseite zur Laufzeit festlegt. Dies ist nicht das Verhalten, das wir für die Inhaltsseiten im Abschnitt Verwaltung benötigen. Stattdessen möchten wir, dass diese Inhaltsseiten immer die AdminNested.master Seite verwenden. Es liegt in der Verantwortung der geschachtelten master Seite, die richtige Inhaltsseite der obersten Ebene zur Laufzeit auszuwählen.

Um dieses gewünschte Verhalten am besten zu erreichen, erstellen Sie eine neue benutzerdefinierte Basisseitenklasse namens AdminBasePage , die die BasePage Klasse erweitert. AdminBasePagekann dann die SetMasterPageFile überschreiben und die Page des Objekts MasterPageFile auf den hartcodierten Wert "~/Admin/AdminNested.master" festlegen. Auf diese Weise verwendet AdminNested.masterjede Seite, die von AdminBasePage abgeleitet wird, während für jede Seite, die von BasePage abgeleitet wird, die MasterPageFile Eigenschaft dynamisch auf "~/Site.master" oder "~/Alternate.master" basierend auf dem Wert der MyMasterPage Sitzungsvariablen festgelegt wird.

Fügen Sie zunächst dem Ordner eine neue Klassendatei mit dem App_Code Namen AdminBasePage.vbhinzu. BasePage Erweitern AdminBasePage und überschreiben Sie dann die SetMasterPageFile Methode. Weisen Sie in dieser Methode den MasterPageFile Wert "~/Admin/AdminNested.master" zu. Nachdem Sie diese Änderungen vorgenommen haben, sollte Ihre Klassendatei wie folgt aussehen:

Public Class AdminBasePage 
 Inherits BasePage 
 Protected Overrides Sub SetMasterPageFile() 
 Me.MasterPageFile = "~/Admin/AdminNested.master" 
 End Sub 
End Class

Nun müssen die vorhandenen Inhaltsseiten im Abschnitt Verwaltung von anstelle von AdminBasePageBasePageabgeleitet werden. Wechseln Sie zur CodeBehind-Klassendatei für jede Inhaltsseite im ~/Admin Ordner, und nehmen Sie diese Änderung vor. Beispielsweise ändern Sie in ~/Admin/Default.aspx die CodeBehind-Klassendeklaration wie:

Partial Class Admin_Default 
 Inherits BasePage

Nach:

Partial Class Admin_Default 
 Inherits AdminBasePage

Abbildung 11 zeigt, wie die Inhaltsseiten der obersten master (Site.master oder Alternate.master), die geschachtelte master Seite (AdminNested.master) und die Inhaltsseiten des Verwaltungsabschnitts miteinander in Beziehung stehen.

Die geschachtelte Gestaltungsvorlage definiert Inhalte, die für die Seiten im Abschnitt Verwaltung spezifisch sind.

Abbildung 11: Die geschachtelte Gestaltungsvorlage definiert Inhalte, die für die Seiten im Abschnitt Verwaltung spezifisch sind (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Schritt 6: Spiegeln der öffentlichen Methoden und Eigenschaften der Gestaltungsvorlage

Denken Sie daran, dass die ~/Admin/AddProduct.aspx Seiten und ~/Admin/Products.aspx programmgesteuert mit der master Seite interagieren: ~/Admin/AddProduct.aspx ruft die öffentliche RefreshRecentProductsGrid Methode der master Seite auf und legt ihre GridMessageText Eigenschaft fest; ~/Admin/Products.aspx verfügt über einen Ereignishandler für das PricesDoubled Ereignis. Im vorherigen Tutorial haben wir eine MustInheritBaseMasterPage Klasse erstellt, die diese öffentlichen Member definiert hat.

Die ~/Admin/AddProduct.aspx Seiten und ~/Admin/Products.aspx gehen davon aus, dass ihre master Seite von der BaseMasterPage -Klasse abgeleitet ist. Die AdminNested.master Seite erweitert jedoch derzeit die System.Web.UI.MasterPage -Klasse. Daher wird beim Besuch ~/Admin/Products.aspx ein InvalidCastException mit der Meldung ausgelöst: "Objekt vom Typ 'ASP.admin_adminnested_master' kann nicht in den Typ 'BaseMasterPage' umgewandelt werden."

Um dies zu beheben, müssen wir die AdminNested.master Code-Behind-Klasse erweitern BaseMasterPage. Aktualisieren Sie die CodeBehind-Klassendeklaration der geschachtelten master-Seite von:

Partial Class Admin_AdminNested 
 Inherits System.Web.UI.MasterPage

Nach:

Partial Class Admin_AdminNested 
 Inherits BaseMasterPage

Wir sind noch nicht fertig. Wir müssen die als MustOverridemarkierten Member überschreiben, nämlich RefreshRecentProductsGrid und GridMessageText. Diese Member werden von den Seiten der obersten master verwendet, um ihre Benutzeroberflächen zu aktualisieren. (Eigentlich nur die Site.master master Seite verwendet diese Methoden, obwohl beide master Seiten der obersten Ebene diese Methoden implementieren, da beide erweiternBaseMasterPage.

Obwohl wir diese Member in AdminNested.masterimplementieren müssen, müssen diese Implementierungen einfach denselben Member auf der obersten master-Seite aufrufen, die von der geschachtelten master Seite verwendet wird. Wenn für instance eine Inhaltsseite im Abschnitt Verwaltung die Methode der geschachtelten master Seite RefreshRecentProductsGrid aufruft, müssen alle geschachtelten master Seite wiederum die Methode oder Alternate.masterRefreshRecentProductsGrid aufrufenSite.master.

Um dies zu erreichen, fügen Sie zunächst die folgende @MasterType Direktive oben AdminNested.masterhinzu:

<%@ MasterType TypeName="BaseMasterPage" %>

Beachten Sie, dass die @MasterType -Direktive der CodeBehind-Klasse eine stark typisierte Eigenschaft mit dem Namen Masterhinzufügt. Überschreiben Sie dann die RefreshRecentProductsGrid Member und und GridMessageText und delegieren Sie den Aufruf einfach an die Masterentsprechende Methode:

Partial Class Admin_AdminNested 
 Inherits BaseMasterPage 
 Public Overrides Property GridMessageText() As String 
 Get 
 Return Master.GridMessageText 
 End Get 
 Set(ByVal value As String) 
 Master.GridMessageText = value 
 End Set 
 End Property 
 Public Overrides Sub RefreshRecentProductsGrid()
 Master.RefreshRecentProductsGrid()
 End Sub 
End Class

Mit diesem Code sollten Sie in der Lage sein, die Inhaltsseiten im Abschnitt Verwaltung zu besuchen und zu verwenden. Abbildung 12 zeigt die ~/Admin/Products.aspx Seite, wenn sie über einen Browser angezeigt wird. Wie Sie sehen können, enthält die Seite das Feld Verwaltungsanweisungen, das auf der seite geschachtelt master definiert ist.

Die Inhaltsseiten im Abschnitt Verwaltung enthalten Anweisungen am Anfang jeder Seite

Abbildung 12: Die Inhaltsseiten im Abschnitt Verwaltung enthalten Anweisungen oben auf jeder Seite (Klicken, um das bild in voller Größe anzuzeigen)

Schritt 7: Verwenden der entsprechenden Top-Level Gestaltungsvorlage zur Laufzeit

Während alle Inhaltsseiten im Abschnitt Verwaltung voll funktionsfähig sind, verwenden sie dieselbe master-Seite auf oberster Ebene und ignorieren die master Seite, die vom Benutzer unter ChooseMasterPage.aspxausgewählt wurde. Dieses Verhalten ist darauf zurückzuführen, dass für die geschachtelte master Seite die MasterPageFile Eigenschaft statisch auf Site.master in der <%@ Master %> -Anweisung festgelegt ist.

Um die vom Endbenutzer ausgewählte Seite der obersten master verwenden zu können, müssen wir die AdminNested.masterEigenschaft des s MasterPageFile auf den Wert in der MyMasterPage Sitzungsvariablen festlegen. Da wir die Eigenschaften der Inhaltsseiten MasterPageFile in BasePagefestlegen, denken Sie möglicherweise, dass wir die geschachtelte master-Seite-Eigenschaft MasterPageFile in BaseMasterPage oder in der CodeBehind-Klasse der AdminNested.masterSeite festlegen würden. Dies funktioniert jedoch nicht, da wir die MasterPageFile Eigenschaft bis zum Ende der PreInit-Phase festgelegt haben müssen. Der früheste Zeitpunkt, zu dem wir programmgesteuert auf den Seitenlebenszyklus einer master Seite zugreifen können, ist die Init-Phase (die nach der PreInit-Phase auftritt).

Daher müssen wir die Eigenschaft der geschachtelten master Seite MasterPageFile aus den Inhaltsseiten festlegen. Die einzigen Inhaltsseiten, die die AdminNested.master master-Seite verwenden, leiten von abAdminBasePage. Daher können wir diese Logik dort platzieren. In Schritt 5 überroden wir die SetMasterPageFile -Methode und legen die Eigenschaft des MasterPageFile Page-Objekts auf "~/Admin/AdminNested.master" fest. Aktualisieren SieSetMasterPageFile, um auch die Eigenschaft der master Seite MasterPageFile auf das in Session gespeicherte Ergebnis festzulegen:

Public Class AdminBasePage 
 Inherits BasePage 
 Protected Overrides Sub SetMasterPageFile() 
 Me.MasterPageFile = "~/Admin/AdminNested.master" 
 Page.Master.MasterPageFile = MyBase.GetMasterPageFileFromSession() 
 End Sub 
End Class

Die GetMasterPageFileFromSession Methode, die wir der BasePage -Klasse im vorherigen Tutorial hinzugefügt haben, gibt den entsprechenden master Seitendateipfad basierend auf dem Wert der Session-Variablen zurück.

Nach dieser Änderung wird die master Seitenauswahl des Benutzers in den Abschnitt Verwaltung übernommen. Abbildung 13 zeigt dieselbe Seite wie Abbildung 12, aber nachdem der Benutzer seine master Seitenauswahl in Alternate.mastergeändert hat.

Auf der Seite

Abbildung 13: Die seite "Geschachtelte Verwaltung" verwendet die vom Benutzer ausgewählte Top-Level Gestaltungsvorlage (klicken, um das bild in voller Größe anzuzeigen)

Zusammenfassung

Ähnlich wie Inhaltsseiten an eine master Seite gebunden werden können, ist es möglich, geschachtelte master Seiten zu erstellen, indem ein untergeordnetes master Seiten an eine übergeordnete master Seite gebunden wird. Die untergeordnete master Seite kann Inhaltssteuerelemente für jedes der übergeordneten ContentPlaceHolders definieren. Sie kann dann eigene ContentPlaceHolder-Steuerelemente (sowie ein anderes Markup) zu diesen Inhaltssteuerelementen hinzufügen. Geschachtelte master Seiten sind sehr nützlich in großen Webanwendungen, bei denen alle Seiten ein übergreifendes Erscheinungsbild haben, aber bestimmte Abschnitte der Website erfordern eindeutige Anpassungen.

Viel Spaß beim Programmieren!

Weitere Informationen

Weitere Informationen zu den in diesem Tutorial erläuterten Themen finden Sie in den folgenden Ressourcen:

Zum Autor

Scott Mitchell, Autor mehrerer ASP/ASP.NET-Bücher 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 3.5 in 24 Stunden. Scott kann unter mitchell@4GuysFromRolla.com oder über seinen Blog unter http://ScottOnWriting.NETerreicht werden.

Besonderen Dank an

Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Möchten Sie meine anstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie mir eine Zeile unter mitchell@4GuysFromRolla.com