Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Scott Mitchell
Untersucht, wie Methoden auf der Masterseite aufgerufen, Eigenschaften festgelegt usw. werden können, wenn man aus dem Code der Inhaltsseite darauf zugreift.
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, wird das Markup der Inhalts- und Masterseiten 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 stellt das Markup bereit, das in die ContentPlaceHolder-Steuerelemente der Gestaltungsvorlage übertragen wird.
Was wir noch untersuchen müssen, ist, wie die Masterseite und die Inhaltsseite programmgesteuert interagieren können. Zusätzlich zur Definition des Markups für die ContentPlaceHolder-Steuerelemente der Gestaltungsvorlage kann eine Inhaltsseite auch Werte an die öffentlichen Eigenschaften der Gestaltungsvorlage zuweisen und deren öffentliche Methoden aufrufen. Ebenso kann eine Masterseite mit ihren Inhaltsseiten verknüpft werden. 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 Masterseite
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 erzeugen muss, während eine kleine Anzahl von Seiten sie anpassen muss, 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 auf der Masterseite definieren und wie Sie ihn dann auf den Seiten überschreiben, auf denen der Standardinhalt nicht benötigt wird.
Eine weitere Option besteht darin, eine öffentliche Eigenschaft oder Methode innerhalb der Gestaltungsvorlage zu erstellen, die angibt, ob der Login-Bereich ein- oder ausgeblendet werden soll. Die Masterpage kann beispielsweise eine öffentliche Eigenschaft mit dem Namen ShowLoginUI enthalten, deren Wert verwendet wurde, um die Visible Eigenschaft des Login-Steuerelements in der Masterpage 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 zwischen Inhalts- und Masterseite tritt auf, wenn Daten, die auf der Masterseite angezeigt werden, aktualisiert werden müssen, nachdem eine Aktion auf der Inhaltsseite erfolgt ist. 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 aufsucht, um einen neuen Datensatz hinzuzufügen, sieht sie die fünf zuletzt hinzugefügten Datensätze auf der Masterseite. Nachdem sie die Werte für die Spalten des neuen Datensatzes ausgefüllt hat, sendet sie das Formular. Wenn angenommen wird, dass die GridView in der Gestaltungsvorlage die EnableViewState Eigenschaft auf "true" (Standardeinstellung) festgelegt hat, 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 und damit der gerade hinzugefügte Datensatz im GridView der Masterseite nach dem Postback angezeigt wird, müssen wir die GridView anweisen, die Datenquelle neu zu binden, nachdem der neue Datensatz zur Datenbank hinzugefügt wurde. Dies erfordert Interaktion zwischen Inhalts- und Masterseiten, da sich die Schnittstelle zum Hinzufügen des neuen Datensatzes (und der zugehörigen Ereignishandler) auf der Inhaltsseite befindet, während sich die zu aktualisierende GridView auf der Masterseite befindet.
Da das Aktualisieren der Masterseite von einem Ereignishandler auf der Inhaltsseite zu den häufigsten Anforderungen für die Interaktion zwischen Inhalten und der Masterseite gehört, sollten wir dieses Thema näher untersuchen. Der Download dieses Lernprogramms enthält eine Microsoft SQL Server 2005 Express Edition-Datenbank mit dem Namen NORTHWIND.MDF, die sich im Ordner App_Data der Website befindet. In der Northwind-Datenbank werden Produkt-, Mitarbeiter- und Vertriebsinformationen für ein fiktives Unternehmen, Northwind Traders, gespeichert.
Schritt 1 beschreibt den Prozess, die fünf zuletzt hinzugefügten Produkte auf einer GridView auf der Masterseite anzuzeigen. In Schritt 2 wird eine Inhaltsseite zum Hinzufügen neuer Produkte erstellt. In Schritt 3 wird erklärt, wie man öffentliche Eigenschaften und Methoden auf der Masterseite erstellt, und Schritt 4 zeigt, wie auf der Inhaltsseite programmgesteuert mit diesen Eigenschaften und Methoden interagiert wird.
Hinweis
Dieses Lernprogramm befasst sich nicht mit den Besonderheiten des Arbeitens mit Daten in ASP.NET. Die Schritte zum Einrichten der Masterseite zum Anzeigen und der Inhaltsseite zum Einfügen von Daten sind abgeschlossen, aber einfach. 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 Masterseite
Öffnen Sie die Masterseite Site.master und fügen Sie ein Label und ein GridView-Steuerelement zu leftContent<div> hinzu. Löschen Sie die Text Eigenschaft des Labels, legen Sie die EnableViewState Eigenschaft auf false fest, und legen Sie ihre ID Eigenschaft auf GridMessage; legen Sie die ID Eigenschaft von GridView 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.
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 verwenden, wird der Assistent anbieten, die Verbindungszeichenfolge in Web.config zu speichern. Speichern Sie die Verbindungszeichenfolge mit dem Namen NorthwindConnectionString.
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 nach ProductID in absteigender Reihenfolge die Produkte zurück, beginnend mit den zuletzt erstellten Produkten.
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 Felder ProductName und UnitPrice anzuzeigen, die aus der Datenbank zurückgegeben werden. An dieser Stelle sollte das deklarative Markup Ihrer Gestaltungsvorlage Markup ähnlich wie Folgendes 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 erstellt und sein 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.
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
Fühlen Sie sich frei, das Erscheinungsbild der GridView zu 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, auf der ein Benutzer ein neues Produkt zur Products-Tabelle hinzufügen kann. Fügen Sie dem Admin-Ordner eine neue Inhaltsseite namens AddProduct.aspx hinzu und binden Sie sie an die Masterseite Site.master. Abbildung 5 zeigt den Solution Explorer, nachdem diese Seite der Website hinzugefügt wurde.
Abbildung 05: Hinzufügen einer neuen ASP.NET Seite zum Admin Ordner(Klicken, um das Bild in voller Größe anzuzeigen)
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 Code-Behind-Klasse der Seite AddProduct.aspx, und leiten Sie sie von BasePage ab (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 SELECT-Anweisung als auch eine 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 dieses DetailsView ausschließlich zum Einfügen von Daten verwendet wird, legen Sie die DefaultMode-Eigenschaft von DetailsView auf Insert.
Das war es schon! Testen wir diese Seite. Besuchen Sie AddProduct.aspx über einen Browser, geben Sie einen Namen und Preis ein (siehe Abbildung 6).
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 einen Postback ausführt. 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 etwas eingefügt wurde. Es wäre schön, eine Meldung anzuzeigen und zu bestätigen, dass ein neuer Datensatz hinzugefügt wurde. Ich lasse dies als Übung für den Leser. Nach dem Hinzufügen eines neuen Datensatzes aus der DetailsView zeigt die GridView auf der Masterseite 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 eines visuellen Feedbacks, das anzeigt, dass das Einfügen erfolgreich war, würde ich Sie ermutigen, auch die Einfüge-Benutzeroberfläche von DetailsView zu aktualisieren, um die Validierung 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 in der Masterseite
In Schritt 1 haben wir ein Label-Websteuerelement hinzugefügt, das den Namen GridMessage trägt und über der GridView in der Masterseite platziert 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 Mitgliedsvariable innerhalb der Masterseite implementiert wird, kann nicht direkt von Inhaltsseiten aus darauf zugegriffen werden. Um mit dem Label aus der Inhaltsseite heraus innerhalb einer Masterseite (oder allgemein jedes Websteuerelement in der Masterseite) zu arbeiten, müssen wir eine öffentliche Eigenschaft in der Masterseite erstellen, die das Websteuerelement verfügbar macht oder als Proxy dient, über den auf eine ihrer Eigenschaften zugegriffen werden kann. Fügen Sie der CodeBehind-Klasse der Masterseite die folgende Syntax hinzu, um die Eigenschaft Text des Labels verfügbar zu machen.
public string GridMessageText
{
get
{
return GridMessage.Text;
}
set
{
GridMessage.Text = value;
}
}
Wenn der Products Tabelle ein neuer Datensatz von einer Inhaltsseite hinzugefügt wird, muss RecentProducts GridView auf der Masterseite erneut an die zugrunde liegende Datenquelle gebunden werden. Um die GridView neu zu binden, rufen Sie die Methode DataBind auf. Da die GridView auf der Masterseite programmatisch nicht von den Inhaltsseiten aus zugänglich ist, müssen wir eine öffentliche Methode in der Masterseite erstellen, die bei Aufruf die Daten erneut an die GridView bindet. Fügen Sie der CodeBehind-Klasse der Masterseite die folgende Methode hinzu:
public void RefreshRecentProductsGrid()
{
RecentProducts.DataBind();
}
Wenn die GridMessageText-Eigenschaft und -RefreshRecentProductsGrid-Methode zur Verfügung stehen, kann jede Inhaltsseite programmatisch den Wert der GridMessage-Label-Text-Eigenschaft festlegen oder auslesen oder die Daten an das RecentProducts-GridView neu binden. In Schritt 4 wird untersucht, wie Sie von einer Inhaltsseite aus auf die öffentlichen Eigenschaften und Methoden der Masterseite zugreifen.
Hinweis
Vergessen Sie nicht, die Eigenschaften und Methoden der Masterseite als public zu markieren. Wenn Sie diese Eigenschaften und Methoden nicht explizit als public kennzeichnen, sind sie von der Inhaltsseite aus nicht zugänglich.
Schritt 4: Aufrufen der öffentlichen Mitglieder der Masterseite von einer Inhaltsseite
Da die Masterseite 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 Masterseite 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 Einfügen-Schaltfläche von DetailsView klickt, löst das DetailsView während des Postbacks sein 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 Masterseite weiterzuarbeiten, erstellen Sie daher einen Ereignishandler für das DetailsView-Ereignis ItemInserted.
Es gibt zwei Möglichkeiten, wie eine Inhaltsseite programmgesteuert mit ihrer Master-Seite interagieren kann.
- Verwenden der
Page.MasterEigenschaft, die einen locker typisierten Verweis auf die Masterseite zurückgibt, oder - Geben Sie den Typ der Masterseite oder den Dateipfad für die Seite über eine
@MasterType-Direktive an; dadurch wird automatisch eine stark typisierte Eigenschaft mit dem NamenMasterzur Seite hinzugefügt.
Lassen Sie uns beide Ansätze untersuchen.
Verwenden der Loosely-Typed-EigenschaftPage.Master
Alle ASP.NET-Webseiten müssen von der Page-Klasse abgeleitet werden, die sich im System.Web.UI-Namespace befindet. Die Page Klasse enthält eine Master-Eigenschaft, die einen Verweis auf die Masterpage der Seite zurückgibt. Wenn die Seite keine Masterseite hat, gibt sie Masternull zurück.
Die Master-Eigenschaft gibt ein Objekt vom Typ MasterPage zurück, das sich ebenfalls im System.Web.UI-Namespace befindet und als Basistyp gilt, von dem alle Masterseiten 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.master genannt haben, wurde die Code-Behind-Klasse Site benannt. 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
Site myMasterPage = Page.Master as Site;
Nachdem wir nun die lose typierte Page.Master Eigenschaft in den Site Typ 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 im IntelliSense-Dropdown-Menü angezeigt.
Abbildung 07: IntelliSense zeigt die Public-Eigenschaften und -Methoden unserer Masterseite (Klicken, um das Bild in voller Größe anzuzeigen)
Hinweis
Wenn Sie die Masterseitendatei MasterPage.master benannt haben, lautet der CodeBehind-Klassenname der Masterseite MasterPage. 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 konvertieren, vollständig qualifizieren, was ein wenig schwierig sein kann, wenn Sie das Projektmodell der Website verwenden. Mein Vorschlag wäre, entweder sicherzustellen, dass Sie beim Erstellen Ihrer Masterseite einen anderen Namen als MasterPage.master wählen oder noch besser einen stark typisierten Verweis auf die Masterseite erstellen.
Erstellen eines stark typierten Verweises mit der@MasterTypeRichtlinie
Wenn Sie genau hinschauen, können Sie erkennen, dass die CodeBehind-Klasse einer ASP.NET-Seite eine Teilklasse 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 (z. B. AddProduct.aspx.cs) enthält den Code, den wir, die Seitenentwickler, erstellen. Zusätzlich zu unserem Code erstellt die ASP.NET-Engine automatisch eine separate Klassendatei mit Eigenschaften und Ereignishandlern, die das deklarative Markup in die Klassenhierarchie der Seite übersetzen.
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 Masterseiten, wenn wir der ASP.NET Engine mitteilen, welche Masterseite von unserer Inhaltsseite verwendet wird, generiert sie eine stark typisierte Master Eigenschaft für uns.
Verwenden Sie die @MasterType Direktive, um die ASP.NET Engine über den Typ der Masterseite der Inhaltsseite zu informieren. Die @MasterType Direktive kann entweder den Typnamen der Masterseite oder den Dateipfad verwenden. Um anzugeben, dass die AddProduct.aspx Seite Site.master als ihre Masterseite verwendet, fügen Sie die folgende Direktive am Anfang von AddProduct.aspx hinzu:
<%@ MasterType VirtualPath="~/Site.master" %>
Diese Direktive weist die ASP.NET-Engine an, einen stark typisierten Verweis auf die Master-Seite über eine Eigenschaft namens Master einzufügen. Mit der @MasterType vorhandenen Direktive können wir die öffentlichen Eigenschaften und Methoden der Site.master Masterseite direkt über die Master Eigenschaft ohne Umwandlungen aufrufen.
Hinweis
Wenn Sie die @MasterType Direktive weglassen, geben Page.Master und Master dasselbe zurück: ein lose typisiertes Objekt an die Masterseite der Seite. Wenn Sie die @MasterType-Direktive einschließen, gibt Master einen stark typisierten Verweis auf die angegebene Masterseite zurück.
Page.Mastergibt jedoch weiterhin einen lose typierten Verweis zurück. Um zu verstehen, warum das so ist und wie die Master-Eigenschaft erstellt wird, wenn die @MasterType-Direktive enthalten wird, lesen Sie den Blogeintrag von K. Scott Allen@MasterType in ASP.NET 2.0.
Aktualisieren der Masterseite nach dem Hinzufügen eines neuen Produkts
Da wir nun wissen, wie die öffentlichen Eigenschaften und Methoden einer Masterseite von einer Inhaltsseite aus aufgerufen werden können, sind wir bereit, die AddProduct.aspx Seite so zu aktualisieren, dass die Masterseite nach dem Hinzufügen eines neuen Produkts aufgefrischt 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 void NewProduct_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
{
// Cast the loosely-typed Page.Master property and then set the GridMessageText property
Site myMasterPage = Page.Master as Site;
myMasterPage.GridMessageText = string.Format("{0} added to grid...", e.Values["ProductName"]);
// Use the strongly-typed Master property
Master.RefreshRecentProductsGrid();
}
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 Gitter hinzugefügt..." festgelegt ist. Auf die Werte des gerade hinzugefügten Produkts kann über die e.Values-Kollektion zugegriffen werden. Wie Sie sehen, wird auf den gerade hinzugefügten Wert über ProductName via e.Values["ProductName"] zugegriffen.
Abbildung 8 zeigt die AddProduct.aspx Seite unmittelbar, nachdem ein neues Produkt - Scott's Soda - zur 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 die GridView der Masterseite 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 Masterseite und ihre Inhaltsseiten vollständig voneinander getrennt und erfordern keine Interaktion. Während Masterseiten und Inhaltsseiten mit diesem Ziel entworfen werden sollten, gibt es eine Reihe häufiger Szenarien, in denen eine Inhaltsseite mit ihrer Masterseite integriert werden muss. Einer der häufigsten Gründe besteht darin, einen bestimmten Teil der Masterseitendarstellung basierend auf einer Aktion zu aktualisieren, die auf der Inhaltsseite stattgefunden hat.
Die gute Nachricht ist, dass es relativ einfach ist, eine Inhaltsseite programmgesteuert mit ihrer Masterseite zu interagieren. Beginnen Sie, indem Sie öffentliche Eigenschaften oder Methoden auf der Masterseite erstellen, die die Funktionalität kapseln, die von einer Inhaltsseite aufgerufen werden soll. Greifen Sie dann auf der Inhaltsseite über die lose typisierte Page.Master Eigenschaft auf die Eigenschaften und Methoden der Masterseite zu, oder verwenden Sie die @MasterType Direktive, um einen stark typisierten Verweis auf die Masterseite zu erstellen.
Im nächsten Tutorial untersuchen wir, wie die Masterseite programmgesteuert mit einer ihrer Inhaltsseiten interagiert.
Glückliche Programmierung!
Weitere Lektüre
Weitere Informationen zu den in diesem Lernprogramm erläuterten Themen finden Sie in den folgenden Ressourcen:
- Zugreifen auf und Aktualisieren von Daten in ASP.NET
- ASP.NET Master Pages: Tipps, Tricks und Fallstricke
-
@MasterTypein ASP.NET 2.0 - Übergeben von Informationen zwischen Inhalt und Masterseiten
- Arbeiten mit Daten in ASP.NET Lernprogrammen
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 unter mitchell@4GuysFromRolla.com erreicht werden oder über seinen Blog unter http://ScottOnWriting.NET.
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 das der Fall ist, schreiben Sie mir eine Nachricht an mitchell@4GuysFromRolla.com