Freigeben über


Interaktion mit der Inhaltsseite über die Masterseite (VB)

von Scott Mitchell

Untersucht, wie Methoden aufgerufen, Eigenschaften festgelegt usw. der Gestaltungsvorlage aus Code in der Inhaltsseite aufgerufen werden.

Einführung

Im Laufe der letzten fünf Lernprogramme haben wir uns angesehen, wie Sie eine Gestaltungsvorlage erstellen, Inhaltsbereiche definieren, ASP.NET Seiten an eine Gestaltungsvorlage binden und seitenspezifische Inhalte definieren. Wenn ein Besucher eine bestimmte Inhaltsseite anfordert, werden das Markup der Inhalte und Gestaltungsvorlagen zur Laufzeit zusammengefügt, was dazu führt, dass eine einheitliche Steuerelementhierarchie gerendert wird. Daher haben wir bereits eine Möglichkeit gesehen, wie die Gestaltungsvorlage und eine ihrer Inhaltsseiten interagieren können: Die Inhaltsseite schreibt das Markup aus, um in die ContentPlaceHolder-Steuerelemente der Gestaltungsvorlage zu transfuse.

Was wir noch untersuchen müssen, ist, wie die Gestaltungsvorlage und die Inhaltsseite programmgesteuert interagieren können. Zusätzlich zum Definieren des Markups für die ContentPlaceHolder-Steuerelemente der Gestaltungsvorlage kann eine Inhaltsseite auch den öffentlichen Eigenschaften der Gestaltungsvorlage Werte zuweisen und die öffentlichen Methoden aufrufen. Ebenso kann eine Gestaltungsvorlage mit ihren Inhaltsseiten interagieren. Während die programmgesteuerte Interaktion zwischen einer Gestaltungsvorlage und einer Inhaltsseite weniger häufig ist als die Interaktion zwischen ihren deklarativen Markups, gibt es viele Szenarien, in denen eine solche programmgesteuerte Interaktion erforderlich ist.

In diesem Lernprogramm untersuchen wir, wie eine Inhaltsseite programmgesteuert mit ihrer Gestaltungsvorlage interagieren kann. Im nächsten Lernprogramm werden wir uns ansehen, wie die Gestaltungsvorlage auf ähnliche Weise mit ihren Inhaltsseiten interagieren kann.

Beispiele für die programmgesteuerte Interaktion zwischen einer Inhaltsseite und ihrer Gestaltungsvorlage

Wenn ein bestimmter Bereich einer Seite auf Seitenbasis konfiguriert werden muss, verwenden wir ein ContentPlaceHolder-Steuerelement. Aber was ist mit Situationen, in denen der Großteil der Seiten eine bestimmte Ausgabe ausgeben muss, aber eine kleine Anzahl von Seiten müssen sie anpassen, um etwas anderes anzuzeigen? Ein solches Beispiel, das wir im Lernprogramm "Multiple ContentPlaceHolders" und "Default Content" untersucht haben, umfasst die Anzeige einer Anmeldeschnittstelle auf jeder Seite. Während die meisten Seiten eine Anmeldeschnittstelle enthalten sollten, sollte sie für eine Handvoll Seiten unterdrückt werden, z. B. die Hauptanmeldungsseite (Login.aspx); die Seite "Konto erstellen" und andere Seiten, auf die nur authentifizierte Benutzer zugreifen können. Das Lernprogramm "Mehrere ContentPlaceHolders" und "Standardinhalt " zeigte, wie sie den Standardinhalt für einen ContentPlaceHolder in der Gestaltungsvorlage definieren und wie Sie ihn dann auf diesen Seiten überschreiben, auf denen der Standardinhalt nicht gewünscht wurde.

Eine weitere Option besteht darin, eine öffentliche Eigenschaft oder Methode innerhalb der Gestaltungsvorlage zu erstellen, die angibt, ob die Anmeldeschnittstelle ein- oder ausgeblendet werden soll. Die Gestaltungsvorlage kann beispielsweise eine öffentliche Eigenschaft mit dem Namen ShowLoginUI enthalten, deren Wert verwendet wurde, um die Visible Eigenschaft des Login-Steuerelements in der Gestaltungsvorlage festzulegen. Diese Inhaltsseiten, auf denen die Anmeldebenutzeroberfläche unterdrückt werden soll, könnten dann programmgesteuert die ShowLoginUI Eigenschaft auf Falsefestlegen.

Das am häufigsten verwendete Beispiel für die Interaktion von Inhalten und Gestaltungsvorlagen tritt auf, wenn daten, die auf der Gestaltungsvorlage angezeigt werden, aktualisiert werden müssen, nachdem eine Aktion auf der Inhaltsseite transpiriert wurde. Betrachten Sie eine Gestaltungsvorlage, die eine GridView enthält, die die fünf zuletzt hinzugefügten Datensätze aus einer bestimmten Datenbanktabelle anzeigt, und dass eine seiner Inhaltsseiten eine Schnittstelle zum Hinzufügen neuer Datensätze zu derselben Tabelle enthält.

Wenn ein Benutzer die Seite besucht, um einen neuen Datensatz hinzuzufügen, sieht er die fünf zuletzt hinzugefügten Datensätze auf der Gestaltungsvorlage. Nachdem sie die Werte für die Spalten des neuen Datensatzes ausgefüllt hat, sendet sie das Formular. Vorausgesetzt, dass die GridView in der Gestaltungsvorlage auf EnableViewState "True" (Standardeinstellung) festgelegt ist, wird der Inhalt aus dem Ansichtszustand neu geladen und folglich werden die fünf gleichen Datensätze angezeigt, obwohl der Datenbank gerade ein neuerer Datensatz hinzugefügt wurde. Dies kann den Benutzer verwirren.

Hinweis

Auch wenn Sie den Ansichtszustand von GridView deaktivieren, sodass er bei jedem Postback an die zugrunde liegende Datenquelle gebunden wird, wird der gerade hinzugefügte Datensatz immer noch nicht angezeigt, da die Daten früher im Seitenlebenszyklus an gridView gebunden sind, als wenn der neue Datensatz der Datenbank hinzugefügt wird.

Um dies zu beheben, damit der gerade hinzugefügte Datensatz im GridView-Element der Gestaltungsvorlage nach dem Postback angezeigt wird, müssen wir die GridView anweisen, die Datenquelle erneut zu verknüpfen, nachdem der neue Datensatz der Datenbank hinzugefügt wurde. Dies erfordert Interaktion zwischen Inhalten und Gestaltungsvorlagen, da sich die Schnittstelle zum Hinzufügen des neuen Datensatzes (und der zugehörigen Ereignishandler) auf der Inhaltsseite befindet, aber die GridView, die aktualisiert werden muss, befindet sich auf der Gestaltungsvorlage.

Da das Aktualisieren der Gestaltungsvorlage von einem Ereignishandler auf der Inhaltsseite zu den häufigsten Anforderungen für Die Interaktion mit Inhalten und Gestaltungsvorlagen gehört, sollten wir dieses Thema ausführlicher untersuchen. Der Download für dieses Lernprogramm enthält eine Microsoft SQL Server 2005 Express Edition-Datenbank, die im Ordner der Website App_Data benannt NORTHWIND.MDF ist. In der Northwind-Datenbank werden Produkt-, Mitarbeiter- und Vertriebsinformationen für ein fiktives Unternehmen, Northwind Traders, gespeichert.

Schritt 1 führt durch die Anzeige der fünf zuletzt hinzugefügten Produkte in einer GridView auf der Gestaltungsvorlage. In Schritt 2 wird eine Inhaltsseite zum Hinzufügen neuer Produkte erstellt. In Schritt 3 wird erläutert, wie öffentliche Eigenschaften und Methoden auf der Gestaltungsvorlage erstellt werden, und Schritt 4 veranschaulicht, wie sie programmgesteuert mit diesen Eigenschaften und Methoden auf der Inhaltsseite zusammenarbeiten.

Hinweis

Dieses Lernprogramm befasst sich nicht mit den Besonderheiten des Arbeitens mit Daten in ASP.NET. Die Schritte zum Einrichten der Gestaltungsvorlage zum Anzeigen von Daten und der Inhaltsseite zum Einfügen von Daten sind abgeschlossen, aber kurz. Ausführlichere Informationen zum Anzeigen und Einfügen von Daten und zur Verwendung der SqlDataSource- und GridView-Steuerelemente finden Sie in den Ressourcen im Abschnitt "Weitere Informationen" am Ende dieses Lernprogramms.

Schritt 1: Anzeigen der fünf zuletzt hinzugefügten Produkte auf der Gestaltungsvorlage

Öffnen Sie die Gestaltungsvorlage "Site.master", und fügen Sie dem leftContent <div>Steuerelement "Label" und ein GridView-Steuerelement hinzu. Löschen Sie die Eigenschaft der Bezeichnung Text , legen Sie die EnableViewState Eigenschaft auf Falseund deren ID Eigenschaft auf GridMessage; legen Sie die Eigenschaft von GridView ID auf RecentProducts. Erweitern Sie als Nächstes im Designer das Smarttag von GridView, und legen Sie fest, dass sie an eine neue Datenquelle gebunden werden soll. Dadurch wird der Assistent für die Datenquellenkonfiguration gestartet. Da es sich bei der App_Data Northwind-Datenbank im Ordner um eine Microsoft SQL Server-Datenbank handelt, wählen Sie die Option zum Erstellen einer SqlDataSource durch Auswählen (siehe Abbildung 1) aus. Nennen Sie die SqlDataSource RecentProductsDataSource.

Binden der GridView an ein SqlDataSource-Steuerelement namens RecentProductsDataSource

Abbildung 01: Binden der GridView an ein benanntes RecentProductsDataSource SqlDataSource-Steuerelement (Klicken, um das Bild in voller Größe anzuzeigen)

Im nächsten Schritt werden wir aufgefordert, anzugeben, mit welcher Datenbank eine Verbindung hergestellt werden soll. Wählen Sie die NORTHWIND.MDF Datenbankdatei aus der Dropdownliste aus, und klicken Sie auf "Weiter". Da wir diese Datenbank zum ersten Mal verwendet haben, bietet der Assistent an, die Verbindungszeichenfolge zu Web.configspeichern. Speichern Sie die Verbindungszeichenfolge mit dem NamenNorthwindConnectionString.

Herstellen einer Verbindung mit der Northwind-Datenbank

Abbildung 02: Herstellen einer Verbindung mit der Northwind-Datenbank (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Der Assistent zum Konfigurieren von Datenquellen bietet zwei Möglichkeiten, mit denen wir die Abfrage angeben können, die zum Abrufen von Daten verwendet wird:

  • Durch Angeben einer benutzerdefinierten SQL-Anweisung oder einer gespeicherten Prozedur oder
  • Indem Sie eine Tabelle oder Ansicht auswählen und dann die spalten angeben, die zurückgegeben werden sollen

Da wir nur die fünf zuletzt hinzugefügten Produkte zurückgeben möchten, müssen wir eine benutzerdefinierte SQL-Anweisung angeben. Verwenden Sie die folgende SELECT Abfrage:

SELECT TOP 5 ProductName, UnitPrice FROM Products ORDER BY ProductID DESC

Das TOP 5 Schlüsselwort gibt nur die ersten fünf Datensätze aus der Abfrage zurück. Der Products Primärschlüssel der Tabelle ist ProductIDeine IDENTITY Spalte, die uns versichert, dass jedes neue Produkt, das der Tabelle hinzugefügt wird, einen größeren Wert als der vorherige Eintrag aufweist. Daher gibt die Sortierung der Ergebnisse ProductID nach absteigender Reihenfolge die Produkte zurück, die mit den zuletzt erstellten produkten beginnen.

Zurückgeben der fünf zuletzt hinzugefügten Produkte

Abbildung 03: Zurückgeben der fünf zuletzt hinzugefügten Produkte (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Nach Abschluss des Assistenten generiert Visual Studio zwei BoundFields für die GridView, um die ProductName aus der Datenbank zurückgegebenen Felder UnitPrice anzuzeigen. An diesem Punkt sollte das deklarative Markup ihrer Gestaltungsvorlage Markup ähnlich wie folgt enthalten:

<asp:Label ID="GridMessage" runat="server" EnableViewState="false"></asp:Label> 
<asp:GridView ID="RecentProducts" runat="server" AutoGenerateColumns="False" 
 DataSourceID="RecentProductsDataSource">
 <Columns> 
 <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
 SortExpression="ProductName" /> 
 <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
 SortExpression="UnitPrice" /> 
 </Columns> 
</asp:GridView> 
<asp:SqlDataSource ID="RecentProductsDataSource" runat="server" 
 ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
 SelectCommand="SELECT TOP 5 ProductName, UnitPrice FROM Products ORDER BY ProductID DESC"> 
</asp:SqlDataSource>

Wie Sie sehen können, enthält das Markup: das Label-Websteuerelement (GridMessage); das GridView RecentProducts-Steuerelement mit zwei BoundFields und ein SqlDataSource-Steuerelement, das die fünf zuletzt hinzugefügten Produkte zurückgibt.

Nachdem dieses GridView-Steuerelement erstellt und das SqlDataSource-Steuerelement konfiguriert wurde, besuchen Sie die Website über einen Browser. Wie in Abbildung 4 dargestellt, sehen Sie ein Raster in der unteren linken Ecke, in dem die fünf zuletzt hinzugefügten Produkte aufgelistet sind.

GridView zeigt die fünf zuletzt hinzugefügten Produkte an.

Abbildung 04: In der GridView werden die fünf zuletzt hinzugefügten Produkte angezeigt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Hinweis

Sie können das Erscheinungsbild der GridView bereinigen. Einige Vorschläge umfassen das Formatieren des angezeigten UnitPrice Werts als Währung und die Verwendung von Hintergrundfarben und Schriftarten, um die Darstellung des Rasters zu verbessern.

Schritt 2: Erstellen einer Inhaltsseite zum Hinzufügen neuer Produkte

Die nächste Aufgabe besteht darin, eine Inhaltsseite zu erstellen, aus der Products ein Benutzer der Tabelle ein neues Produkt hinzufügen kann. Fügen Sie dem Ordner eine neue Inhaltsseite mit dem Admin Namen AddProduct.aspxhinzu, und stellen Sie sicher, dass sie an die Gestaltungsvorlage Site.master gebunden wird. Abbildung 5 zeigt die Projektmappen-Explorer, nachdem diese Seite der Website hinzugefügt wurde.

Hinzufügen einer neuen ASP.NET Seite zum Administratorordner

Abbildung 05: Hinzufügen einer neuen ASP.NET Seite zum Ordner (Zum Anzeigen des Admin Bilds mit voller Größe klicken)

Erinnern Sie sich daran, dass wir im Lernprogramm "Titel", "Metatags" und "Andere HTML-Kopfzeilen" eine benutzerdefinierte Basisseitenklasse mit dem Namen BasePage erstellt haben, die den Titel der Seite generiert hat, wenn sie nicht explizit festgelegt wurde. Wechseln Sie zur CodeBehind-Klasse der AddProduct.aspx Seite, und leiten Sie sie ab BasePage (statt von System.Web.UI.Page).

Aktualisieren Sie schließlich die Web.sitemap Datei so, dass sie einen Eintrag für diese Lektion enthält. Fügen Sie unter der <siteMapNode> Lektion "Steuerelement-ID-Benennungsprobleme" das folgende Markup hinzu:

<siteMapNode url="~/Admin/AddProduct.aspx" title="Content to Master Page Interaction" />

Wie in Abbildung 6 dargestellt, wird das Hinzufügen dieses <siteMapNode> Elements in der Liste "Lektionen" wiedergegeben.

Zurück zu AddProduct.aspx. Fügen Sie im Inhaltssteuerelement für den MainContent ContentPlaceHolder ein DetailsView-Steuerelement hinzu, und nennen Sie es NewProduct. Binden Sie die DetailsView an ein neues SqlDataSource-Steuerelement mit dem Namen NewProductDataSource. Konfigurieren Sie wie bei sqlDataSource in Schritt 1 den Assistenten so, dass er die Northwind-Datenbank verwendet, und wählen Sie eine benutzerdefinierte SQL-Anweisung aus. Da die DetailsView zum Hinzufügen von Elementen zur Datenbank verwendet wird, müssen wir sowohl eine Anweisung als auch eine SELECT INSERT Anweisung angeben. Verwenden Sie die folgende SELECT Abfrage:

SELECT ProductName, UnitPrice FROM Products

Fügen Sie dann auf der Registerkarte INSERT die folgende INSERT Anweisung hinzu:

INSERT INTO Products(ProductName, UnitPrice) VALUES(@ProductName, @UnitPrice)

Nach Abschluss des Assistenten wechseln Sie zum Smarttag von DetailsView, und aktivieren Sie das Kontrollkästchen "Einfügen aktivieren". Dadurch wird der DetailsView ein CommandField hinzugefügt, dessen ShowInsertButton Eigenschaft auf "True" festgelegt ist. Da diese DetailsView ausschließlich zum Einfügen von Daten verwendet wird, legen Sie die Eigenschaft von DefaultMode DetailsView auf Insert.

Das war es schon! Testen wir diese Seite. Besuchen Sie AddProduct.aspx einen Browser, geben Sie einen Namen und preis ein (siehe Abbildung 6).

Hinzufügen eines neuen Produkts zur Datenbank

Abbildung 06: Hinzufügen eines neuen Produkts zur Datenbank (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Nachdem Sie den Namen und den Preis für Ihr neues Produkt eingegeben haben, klicken Sie auf die Schaltfläche "Einfügen". Dies bewirkt, dass das Formular postbacken wird. Bei postback wird die Anweisung des SqlDataSource-Steuerelements INSERT ausgeführt. Die beiden Parameter werden mit den vom Benutzer eingegebenen Werten in den beiden TextBox-Steuerelementen von DetailsView aufgefüllt. Leider gibt es kein visuelles Feedback, dass ein Einfügen aufgetreten ist. Es wäre schön, eine Meldung anzuzeigen und zu bestätigen, dass ein neuer Datensatz hinzugefügt wurde. Ich belässt dies als Übung für den Leser. Nach dem Hinzufügen eines neuen Datensatzes aus der DetailsView zeigt die GridView auf der Gestaltungsvorlage weiterhin dieselben fünf Datensätze wie zuvor an. sie enthält nicht den gerade hinzugefügten Datensatz. Wir werden untersuchen, wie Sie dies in den kommenden Schritten beheben können.

Hinweis

Zusätzlich zum Hinzufügen von visuellem Feedback, das das Einfügen erfolgreich war, würde ich Sie ermutigen, auch die Einfügeschnittstelle von DetailsView zu aktualisieren, um die Überprüfung einzuschließen. Derzeit gibt es keine Überprüfung. Wenn ein Benutzer einen ungültigen Wert für das UnitPrice Feld eingibt, z. B. "Zu teuer", wird beim Postback eine Ausnahme ausgelöst, wenn das System versucht, diese Zeichenfolge in eine Dezimalzahl zu konvertieren. Weitere Informationen zum Anpassen der Einfügeschnittstelle finden Sie im Lernprogramm zum Anpassen der Datenänderungsschnittstelle aus meiner Lernprogrammreihe "Arbeiten mit Daten".

Schritt 3: Erstellen öffentlicher Eigenschaften und Methoden auf der Gestaltungsvorlage

In Schritt 1 haben wir ein Label-Websteuerelement hinzugefügt, das über der GridView in der Gestaltungsvorlage benannt GridMessage ist. Diese Bezeichnung soll optional eine Meldung anzeigen. Nach dem Hinzufügen eines neuen Datensatzes zur Products Tabelle möchten wir beispielsweise eine Meldung anzeigen, die lautet: "ProductName wurde zur Datenbank hinzugefügt." Anstatt den Text für diese Bezeichnung auf der Gestaltungsvorlage hart zu codieren, möchten wir möglicherweise, dass die Nachricht von der Inhaltsseite angepasst werden kann.

Da das Bezeichnungssteuerelement als geschützte Membervariable innerhalb der Gestaltungsvorlage implementiert wird, kann nicht direkt von Inhaltsseiten aus darauf zugegriffen werden. Um mit der Bezeichnung innerhalb einer Gestaltungsvorlage von der Inhaltsseite (oder aus diesem Grund jedes Websteuerelement in der Gestaltungsvorlage) zu arbeiten, müssen wir eine öffentliche Eigenschaft auf der Gestaltungsvorlage erstellen, die das Websteuerelement verfügbar macht oder als Proxy dient, über den auf eine seiner Eigenschaften zugegriffen werden kann. Fügen Sie der CodeBehind-Klasse der Gestaltungsvorlage die folgende Syntax hinzu, um die Eigenschaft "Label" Text verfügbar zu machen:

Public Property GridMessageText() As String 
 Get
 Return GridMessage.Text 
 End Get 
 Set(ByVal Value As String) 
 GridMessage.Text = Value 
 End Set 
End Property

Wenn der Products Tabelle ein neuer Datensatz von einer Inhaltsseite hinzugefügt wird, muss GridView RecentProducts in der Gestaltungsvorlage erneut an die zugrunde liegende Datenquelle gebunden werden. Um die GridView-Methode DataBind neu zu binden. Da die GridView in der Gestaltungsvorlage nicht programmgesteuert auf die Inhaltsseiten zugegriffen werden kann, müssen wir eine öffentliche Methode auf der Gestaltungsvorlage erstellen, die die Daten beim Aufruf erneut an gridView gebunden. Fügen Sie der CodeBehind-Klasse der Gestaltungsvorlage die folgende Methode hinzu:

Public Sub RefreshRecentProductsGrid() 
 RecentProducts.DataBind()
End Sub

Wenn die GridMessageText Eigenschaft und RefreshRecentProductsGrid Methode vorhanden ist, kann jede Inhaltsseite programmgesteuert den Wert der Eigenschaft der GridMessage Bezeichnung Text festlegen oder lesen oder die Daten an gridView RecentProducts binden. In Schritt 4 wird untersucht, wie sie von einer Inhaltsseite aus auf die öffentlichen Eigenschaften und Methoden der Gestaltungsvorlage zugreifen.

Hinweis

Vergessen Sie nicht, die Eigenschaften und Methoden der Gestaltungsvorlage als zu Publicmarkieren. Wenn Sie diese Eigenschaften und Methoden Publicnicht explizit als kennzeichnen, können sie nicht von der Inhaltsseite aus darauf zugreifen.

Schritt 4: Aufrufen der öffentlichen Mitglieder der Gestaltungsvorlage über eine Inhaltsseite

Da die Gestaltungsvorlage nun über die erforderlichen öffentlichen Eigenschaften und Methoden verfügt, können wir diese Eigenschaften und Methoden von der AddProduct.aspx Inhaltsseite aufrufen. Insbesondere müssen wir die Eigenschaft der Gestaltungsvorlage GridMessageText festlegen und die RefreshRecentProductsGrid Methode aufrufen, nachdem das neue Produkt der Datenbank hinzugefügt wurde. Alle ASP.NET Datenwebsteuerelemente auslösen Ereignisse unmittelbar vor und nach abschluss verschiedener Aufgaben, wodurch Seitenentwickler entweder vor oder nach der Aufgabe programmgesteuerte Aktionen ausführen können. Wenn der Endbenutzer beispielsweise auf die Schaltfläche "Einfügen" von DetailsView klickt, löst das DetailsView-Ereignis beim Postback das ItemInserting Ereignis aus, bevor der Einfügeworkflow beginnt. Anschließend wird der Datensatz in die Datenbank eingefügt. Danach löst die DetailsView das ItemInserted Ereignis aus. Um nach dem Hinzufügen des neuen Produkts mit der Gestaltungsvorlage zu arbeiten, erstellen Sie daher einen Ereignishandler für das DetailView-Ereignis ItemInserted .

Es gibt zwei Möglichkeiten, wie eine Inhaltsseite programmgesteuert mit ihrer Gestaltungsvorlage schnittstellen kann:

  • Verwenden der Page.Master Eigenschaft, die einen lose eingegebenen Verweis auf die Gestaltungsvorlage zurückgibt, oder
  • Geben Sie den Gestaltungsvorlagentyp oder den Dateipfad der Seite über eine @MasterType Direktive an. Dadurch wird automatisch eine stark typisierte Eigenschaft zur Seite mit dem Namen Masterhinzugefügt.

Lassen Sie uns beide Ansätze untersuchen.

Verwenden der Losely-Typed-EigenschaftPage.Master

Alle ASP.NET Webseiten müssen von der Page Klasse abgeleitet werden, die System.Web.UI sich im Namespace befindet. Die Page Klasse enthält eine Master Eigenschaft , die einen Verweis auf die Gestaltungsvorlage der Seite zurückgibt. Wenn die Seite keine Gestaltungsvorlage Master zurückgibt Nothing.

Die Master Eigenschaft gibt ein Objekt vom Typ MasterPage (auch im System.Web.UI Namespace) zurück, bei dem es sich um den Basistyp handelt, von dem alle Gestaltungsvorlagen abgeleitet sind. Um daher öffentliche Eigenschaften oder Methoden zu verwenden, die auf der Gestaltungsvorlage unserer Website definiert sind, müssen wir das MasterPage von der Master Eigenschaft zurückgegebene Objekt in den entsprechenden Typ umwandeln. Da wir unsere Gestaltungsvorlagendatei Site.masterbenannt haben, wurde die CodeBehind-Klasse benannt Site. Daher wandelt der folgende Code die Page.Master Eigenschaft in eine Instanz der Site Klasse um.

' Cast the loosely-typed Page.Master property and then set the GridMessageText property 
Dim myMasterPage As Site = CType(Page.Master, Site)

Nachdem wir nun die lose typierte Page.Master Eigenschaft in den Websitetyp umgewandelt haben, können wir auf die Eigenschaften und Methoden verweisen, die für Die Website spezifisch sind. Wie in Abbildung 7 dargestellt, wird die öffentliche Eigenschaft GridMessageText in der IntelliSense-Dropdownliste angezeigt.

IntelliSense zeigt die öffentlichen Eigenschaften und Methoden unserer Gestaltungsvorlage an.

Abbildung 07: IntelliSense zeigt die öffentlichen Eigenschaften und Methoden der Gestaltungsvorlage (Klicken, um das Bild in voller Größe anzuzeigen)

Hinweis

Wenn Sie die Gestaltungsvorlagendatei MasterPage.master benannt haben, lautet MasterPageder CodeBehind-Klassenname der Gestaltungsvorlage . Dies kann beim Umwandeln von Typ System.Web.UI.MasterPage zu Klasse MasterPage zu mehrdeutigem Code führen. Kurz gesagt, Sie müssen den Typ, in den Sie umwandeln, vollständig qualifizieren, was ein wenig schwierig sein kann, wenn Sie das Project-Modell der Website verwenden. Mein Vorschlag wäre, entweder sicherzustellen, dass Sie beim Erstellen Ihrer Gestaltungsvorlage einen anderen Namen als MasterPage.master oder noch besser einen stark typierten Verweis auf die Gestaltungsvorlage erstellen.

Erstellen eines stark typierten Verweises mit der@MasterTypeRichtlinie

Wenn Sie genau sehen, dass die CodeBehind-Klasse einer ASP.NET Seite eine partielle Klasse ist (beachten Sie das Partial Schlüsselwort in der Klassendefinition). Partielle Klassen wurden in C# und Visual Basic with.NET Framework 2.0 eingeführt und ermöglichen es kurz gesagt, dass die Member einer Klasse in mehreren Dateien definiert werden können. Die CodeBehind-Klassendatei ( AddProduct.aspx.vbz. B. ) enthält den Code, den wir, den Seitenentwickler, erstellen. Zusätzlich zu unserem Code erstellt das modul ASP.NET automatisch eine separate Klassendatei mit Eigenschaften und Ereignishandlern, in die das deklarative Markup in die Klassenhierarchie der Seite übersetzt wird.

Die automatische Codegenerierung, die auftritt, wenn eine ASP.NET Seite besucht wird, ebnet den Weg für einige ziemlich interessante und nützliche Möglichkeiten. Im Fall von Gestaltungsvorlagen, wenn wir dem ASP.NET Modul mitteilen, welche Gestaltungsvorlage von unserer Inhaltsseite verwendet wird, generiert sie eine stark typierte Master Eigenschaft für uns.

Verwenden Sie die @MasterType Direktive , um das ASP.NET Modul über den Gestaltungsvorlagentyp der Inhaltsseite zu informieren. Die @MasterType Direktive kann entweder den Typnamen der Gestaltungsvorlage oder den Dateipfad akzeptieren. Um anzugeben, dass die AddProduct.aspx Seite als Gestaltungsvorlage verwendet Site.master wird, fügen Sie die folgende Direktive am Anfang von AddProduct.aspx:

<%@ MasterType VirtualPath="~/Site.master" %>

Diese Direktive weist das modul ASP.NET an, einen stark typierten Verweis auf die Gestaltungsvorlage über eine Eigenschaft namens Masterhinzuzufügen. Mit der @MasterType direkten Direktive können wir die öffentlichen Eigenschaften und Methoden der Site.master Gestaltungsvorlage direkt über die Master Eigenschaft ohne Umwandlungen aufrufen.

Hinweis

Wenn Sie die @MasterType Direktive weglassen, geben Sie die Syntax Page.Master zurück und Master geben dasselbe zurück: ein lose typiertes Objekt an die Gestaltungsvorlage der Seite. Wenn Sie die @MasterType Direktive einschließen, Master wird ein stark typisierter Verweis auf die angegebene Gestaltungsvorlage zurückgegeben. Page.Mastergibt jedoch weiterhin einen lose typierten Verweis zurück. Einen ausführlicheren Blick darauf, warum dies der Fall ist und wie die Eigenschaft erstellt wird, wenn die Master @MasterType Direktive enthalten ist, finden Sie im Blogeintrag @MasterType von K. Scott Allen in ASP.NET 2.0.

Aktualisieren der Gestaltungsvorlage nach dem Hinzufügen eines neuen Produkts

Da wir nun wissen, wie die öffentlichen Eigenschaften und Methoden einer Gestaltungsvorlage von einer Inhaltsseite aufgerufen werden, können wir die AddProduct.aspx Seite aktualisieren, damit die Gestaltungsvorlage nach dem Hinzufügen eines neuen Produkts aktualisiert wird. Zu Beginn von Schritt 4 haben wir einen Ereignishandler für das Ereignis des DetailsView-Steuerelements ItemInserting erstellt, der unmittelbar nach dem Hinzufügen des neuen Produkts zur Datenbank ausgeführt wird. Fügen Sie dem Ereignishandler den folgenden Code hinzu:

Protected Sub NewProduct_ItemInserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertedEventArgs) Handles NewProduct.ItemInserted
 ' Cast the loosely-typed Page.Master property and then set the GridMessageText property 
 Dim myMasterPage As Site = CType(Page.Master, Site) 
 myMasterPage.GridMessageText = String.Format("{0} added to grid...", e.Values("ProductName"))
 ' Use the strongly-typed Master property 
 Master.RefreshRecentProductsGrid()
End Sub

Der obige Code verwendet sowohl die lose typierte Page.Master Eigenschaft als auch die stark typierte Master Eigenschaft. Beachten Sie, dass die GridMessageText Eigenschaft auf "ProductName zum Raster hinzugefügt..." festgelegt ist. Auf die Werte des gerade hinzugefügten Produkts kann über die e.Values Sammlung zugegriffen werden. Wie Sie sehen können, wird auf den Just-Added-Wert ProductName zugegriffen e.Values("ProductName").

Abbildung 8 zeigt die AddProduct.aspx Seite unmittelbar nach einem neuen Produkt – Scott es Soda – der Datenbank hinzugefügt wurde. Beachten Sie, dass der soeben hinzugefügte Produktname im Label der Gestaltungsvorlage angegeben ist und dass die GridView aktualisiert wurde, um das Produkt und den Preis einzuschließen.

Die Beschriftung und gridView der Gestaltungsvorlage zeigen das gerade hinzugefügte Produkt an.

Abbildung 08: Beschriftung und GridView der Gestaltungsvorlage zeigen das gerade hinzugefügte Produkt an (Klicken, um das Bild in voller Größe anzuzeigen)

Zusammenfassung

Im Idealfall sind eine Gestaltungsvorlage und ihre Inhaltsseiten vollständig voneinander getrennt und erfordern keine Interaktionsebene. Während Gestaltungsvorlagen und Inhaltsseiten mit diesem Ziel entworfen werden sollten, gibt es eine Reihe häufiger Szenarien, in denen eine Inhaltsseite mit ihrer Gestaltungsvorlage schnittstellen muss. Einer der häufigsten Gründe besteht darin, einen bestimmten Teil der Gestaltungsvorlagenanzeige basierend auf einer Aktion zu aktualisieren, die auf der Inhaltsseite transpiriert wurde.

Die gute Nachricht ist, dass es relativ einfach ist, eine Inhaltsseite programmgesteuert mit ihrer Gestaltungsvorlage zu interagieren. Erstellen Sie zunächst öffentliche Eigenschaften oder Methoden auf der Gestaltungsvorlage, die die Funktionalität kapselt, die von einer Inhaltsseite aufgerufen werden muss. Greifen Sie dann auf der Inhaltsseite über die lose typierte Page.Master Eigenschaft auf die Eigenschaften und Methoden der Gestaltungsvorlage zu, oder verwenden Sie die @MasterType Direktive, um einen stark typierten Verweis auf die Gestaltungsvorlage zu erstellen.

Im nächsten Lernprogramm untersuchen wir, wie die Gestaltungsvorlage programmgesteuert mit einer seiner Inhaltsseiten interagiert.

Glückliche Programmierung!

Weitere nützliche Informationen

Weitere Informationen zu den in diesem Lernprogramm 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 Web Technologies zusammen. Scott arbeitet als unabhängiger Berater, Trainer und Schriftsteller. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 3.5 in 24 Stunden. Scott kann über seinen Blog unter mitchell@4GuysFromRolla.com oder über seinen Blog erreicht http://ScottOnWriting.NETwerden.

Besonderer Dank an

Diese Lernprogrammreihe wurde von vielen hilfreichen Prüfern überprüft. Lead Reviewer für dieses Lernprogramm war Zack Jones. Möchten Sie meine bevorstehenden MSDN-Artikel überprüfen? Wenn dies der Fall ist, legen Sie mir eine Zeile bei mitchell@4GuysFromRolla.com