Share via


Interaktion mit der Inhaltsseite von der Masterseite (C#)

von Scott Mitchell

Untersucht, wie Methoden aufgerufen, Eigenschaften usw. der Gestaltungsvorlage über Code auf der Inhaltsseite festgelegt werden.

Einführung

In den letzten fünf Tutorials haben wir untersucht, wie Sie eine master Seite erstellen, Inhaltsbereiche definieren, ASP.NET Seiten an eine master Seite binden und seitenspezifische Inhalte definieren. Wenn ein Besucher eine bestimmte Inhaltsseite anfordert, werden der Inhalt und das Markup master Seiten zur Laufzeit verschmolzen, was zum Rendern einer einheitlichen Steuerelementhierarchie führt. Daher haben wir bereits eine Möglichkeit gesehen, wie die master Seite und eine ihrer Inhaltsseiten interagieren können: Die Inhaltsseite schreibt das Markup zum Transfuse in die ContentPlaceHolder-Steuerelemente der master Seite aus.

Wir müssen noch untersuchen, wie master Seite und Inhaltsseite programmgesteuert interagieren können. Zusätzlich zum Definieren des Markups für die ContentPlaceHolder-Steuerelemente der master Seite kann eine Inhaltsseite auch den öffentlichen Eigenschaften der master Seite Werte zuweisen und ihre öffentlichen Methoden aufrufen. Ebenso kann eine master Seite mit ihren Inhaltsseiten interagieren. Während die programmgesteuerte Interaktion zwischen einer master- und 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 Tutorial untersuchen wir, wie eine Inhaltsseite programmgesteuert mit ihrer master-Seite interagieren kann. Im nächsten Tutorial untersuchen wir, wie die master Seite auf ähnliche Weise mit ihren Inhaltsseiten interagieren kann.

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

Wenn eine bestimmte Region einer Seite seiteweise konfiguriert werden muss, verwenden wir ein ContentPlaceHolder-Steuerelement. Aber was ist mit Situationen, in denen die Mehrheit der Seiten eine bestimmte Ausgabe ausgeben muss, aber eine kleine Anzahl von Seiten sie anpassen muss, um etwas anderes anzuzeigen? Ein beispiel, das wir im Tutorial Multiple ContentPlaceHolders and Default Content untersucht haben, umfasst das Anzeigen 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 Standard Anmeldeseite (Login.aspx), die Seite Konto erstellen und andere Seiten, auf die nur authentifizierte Benutzer zugreifen können. Im Tutorial Mehrere ContentPlaceHolders und Standardinhalte wurde gezeigt, wie Sie den Standardinhalt für einen ContentPlaceHolder auf der seite master definieren und dann auf den Seiten überschreiben, auf denen der Standardinhalt nicht gewünscht wurde.

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

Das vielleicht häufigste Beispiel für Die Interaktion von Inhalten und master Seiten tritt auf, wenn die in der master Seite angezeigten Daten aktualisiert werden müssen, nachdem eine Aktion auf der Inhaltsseite aufgetreten ist. Betrachten Sie eine master Seite, die eine GridView enthält, die die fünf zuletzt hinzugefügten Datensätze aus einer bestimmten Datenbanktabelle anzeigt, und dass eine ihrer 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, werden die fünf zuletzt hinzugefügten Datensätze auf der Seite master angezeigt. Nachdem sie die Werte für die Spalten des neuen Datensatzes ausgefüllt hat, sendet sie das Formular. Unter der Annahme, dass die GridView-Eigenschaft auf der master-Seite auf true (Standard) festgelegt istEnableViewState, 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

Selbst wenn Sie den Ansichtszustand von GridView deaktivieren, sodass es bei jedem Postback an die zugrunde liegende Datenquelle neu gebunden wird, wird der gerade hinzugefügte Datensatz immer noch nicht angezeigt, da die Daten früher im Seitenlebenszyklus an gridView gebunden sind als beim Hinzufügen des neuen Datensatzes zur Datenbank.

Um dies zu beheben, sodass der gerade hinzugefügte Datensatz im GridView-Postback der master Seite angezeigt wird, müssen wir gridView anweisen, nach dem Hinzufügen des neuen Datensatzes zur Datenbank erneut an seine Datenquelle zu binden. Dies erfordert eine Interaktion zwischen dem Inhalt und master Seiten, da sich die Schnittstelle zum Hinzufügen des neuen Datensatzes (und der zugehörigen Ereignishandler) auf der Inhaltsseite befindet, sich aber die Zu aktualisierende GridView auf der master Seite befindet.

Da das Aktualisieren der Anzeige der master-Seite von einem Ereignishandler auf der Inhaltsseite eine der häufigsten Anforderungen für Die Interaktion von Inhalten und master Seiten darstellt, untersuchen wir dieses Thema ausführlicher. Der Download für dieses Tutorial enthält eine Microsoft SQL Server 2005 Express Edition-Datenbank namens NORTHWIND.MDF im Ordner der App_Data Website. Die Northwind-Datenbank speichert Produkt-, Mitarbeiter- und Vertriebsinformationen für ein fiktives Unternehmen, Northwind Traders.

Schritt 1 zeigt die fünf zuletzt hinzugefügten Produkte in einer GridView auf der Seite master an. Schritt 2 erstellt eine Inhaltsseite zum Hinzufügen neuer Produkte. Schritt 3 befasst sich mit dem Erstellen öffentlicher Eigenschaften und Methoden auf der seite master, und Schritt 4 veranschaulicht, wie sie programmgesteuert eine Schnittstelle mit diesen Eigenschaften und Methoden von der Inhaltsseite aus herstellen.

Hinweis

In diesem Tutorial werden die Besonderheiten der Arbeit mit Daten in ASP.NET nicht behandelt. Die Schritte zum Einrichten der master Seite zum Anzeigen von Daten und der Inhaltsseite zum Einfügen von Daten sind abgeschlossen, aber noch luftig. Einen ausführlicheren Einblick in das Anzeigen und Einfügen von Daten und die Verwendung der Steuerelemente SqlDataSource und GridView finden Sie in den Ressourcen im Abschnitt Weitere Informationen am Ende dieses Tutorials.

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

Öffnen Sie die Site.master seite master, und fügen Sie ein leftContent<div>Label und ein GridView-Steuerelement hinzu. Löschen Sie die Label-Eigenschaft Text , legen Sie ihre EnableViewState Eigenschaft auf false und ihre ID Eigenschaft auf GridMessagefest. Legen Sie die GridView-Eigenschaft ID auf fest RecentProducts. Erweitern Sie als Nächstes in der Designer das Smarttag von GridView, und binden Sie es an eine neue Datenquelle. Dadurch wird der Assistent für die Datenquellenkonfiguration gestartet. Da es sich bei der Northwind-Datenbank im App_Data Ordner um eine Microsoft SQL Server-Datenbank handelt, können Sie eine SqlDataSource erstellen, indem Sie auswählen (siehe Abbildung 1); benennen Sie sqlDataSource RecentProductsDataSource.

Binden des GridView an ein SqlDataSource-Steuerelement namens RecentProductsDataSource

Abbildung 01: Binden der GridView an ein SqlDataSource-Steuerelement namens RecentProductsDataSource (Klicken Sie hier, 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 diese Datenbank zum ersten Mal verwendet wird, bietet der Assistent an, die Verbindungszeichenfolge in Web.configzu speichern. Speichern Sie die Verbindungszeichenfolge mit dem Namen NorthwindConnectionString.

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 "Datenquelle konfigurieren" 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 gespeicherten Prozedur oder
  • Wählen Sie eine Tabelle oder Ansicht aus, und geben Sie dann die spalten an, 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

Die TOP 5 Schlüsselwort (keyword) gibt nur die ersten fünf Datensätze aus der Abfrage zurück. Der Products Primärschlüssel der Tabelle, ProductID, ist eine IDENTITY Spalte, die uns versichert, dass jedes neue Produkt, das der Tabelle hinzugefügt wird, einen größeren Wert als der vorherige Eintrag aufweist. Wenn Sie die Ergebnisse ProductID nach in absteigender Reihenfolge sortieren, werden die Produkte daher mit den zuletzt erstellten zurückgegeben.

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 gridView, um die aus der ProductName Datenbank zurückgegebenen Felder und UnitPrice anzuzeigen. An diesem Punkt sollte das deklarative Markup Ihrer master Seite ein Markup 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); die GridView RecentProductsmit zwei BoundFields; und ein SqlDataSource-Steuerelement, das die fünf zuletzt hinzugefügten Produkte zurückgibt.

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

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

Abbildung 04: Die GridView zeigt die fünf zuletzt hinzugefügten Produkte an (klicken, um das bild in voller Größe anzuzeigen)

Hinweis

Fühlen Sie sich frei, das Erscheinungsbild der GridView zu sauber. 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

Unsere nächste Aufgabe besteht darin, eine Inhaltsseite zu erstellen, von der aus ein Benutzer ein neues Produkt zur Products Tabelle 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 Site.master seite master gebunden ist. Abbildung 5 zeigt die Projektmappen-Explorer, nachdem diese Seite der Website hinzugefügt wurde.

Hinzufügen einer Neuen ASP.NET-Seite zum Admin Ordner

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 im Tutorial Angeben von Titel, Metatags und anderen HTML-Headern im Gestaltungsvorlagen-Tutorial eine benutzerdefinierte Basisseitenklasse mit dem Namen BasePage erstellt wurde, die den Titel der Seite generiert hat, wenn er nicht explizit festgelegt wurde. Wechseln Sie zur CodeBehind-Klasse der AddProduct.aspx Seite, und lassen Sie sie von BasePage (statt von ) ableiten System.Web.UI.Page.

Aktualisieren Sie abschließend die Web.sitemap Datei so, dass sie einen Eintrag für diese Lektion enthält. Fügen Sie das folgende Markup unter dem <siteMapNode> für die Lektion Steuerungs-ID-Benennungsprobleme 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 widerspiegelt.

Kehren Sie zu AddProduct.aspxzurück. Fügen Sie im Content-Steuerelement für den MainContent ContentPlaceHolder ein DetailsView-Steuerelement hinzu, und nennen Sie es NewProduct. Binden Sie das DetailsView-Steuerelement 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)

Wechseln Sie nach Abschluss des Assistenten zum Smarttag von DetailsView, und aktivieren Sie das Kontrollkästchen "Einfügen aktivieren". Dadurch wird der DetailsView ein CommandField-Element hinzugefügt, dessen ShowInsertButton Eigenschaft auf true festgelegt ist. Da diese DetailsView nur zum Einfügen von Daten verwendet wird, legen Sie die Eigenschaft von DetailsView DefaultMode auf fest Insert.

Das war es schon! Testen wir diese Seite. Rufen Sie AddProduct.aspx einen Browser auf, und geben Sie einen Namen und einen 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 führt dazu, dass das Formular postbacken wird. Beim 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 eine Einfügung erfolgt ist. Es wäre schön, wenn eine Meldung angezeigt wird, die bestätigt, dass ein neuer Datensatz hinzugefügt wurde. Ich belasse dies als Übung für den Leser. Nach dem Hinzufügen eines neuen Datensatzes aus detailsView zeigt die GridView auf der Seite master weiterhin die gleichen fünf Datensätze wie zuvor an. Der gerade hinzugefügte Datensatz ist nicht enthalten. In den nächsten Schritten wird untersucht, wie Sie dies beheben können.

Hinweis

Zusätzlich zum Hinzufügen eines visuellen Feedbacks, dass die Einfügung erfolgreich war, ermutige ich Sie, auch die Einfügeschnittstelle von DetailsView so zu aktualisieren, dass sie eine Überprüfung enthält. Derzeit gibt es keine Validierung. 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 ein Dezimalzeichen zu konvertieren. Weitere Informationen zum Anpassen der Einfügeschnittstelle finden Sie im Tutorial Anpassen der Datenänderungsschnittstelle in meiner Tutorialreihe Arbeiten mit Daten.

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

In Schritt 1 haben wir auf der Seite master ein Label Web-Steuerelement mit dem Namen GridMessage über gridView hinzugefügt. Diese Bezeichnung soll optional eine Meldung anzeigen. Nach dem Hinzufügen eines neuen Datensatzes zur Tabelle möchten wir beispielsweise eine Meldung mit der Products folgenden Meldung anzeigen: "ProductName wurde der Datenbank hinzugefügt." Anstatt den Text für diese Bezeichnung auf der seite master festzucodieren, möchten wir möglicherweise, dass die Nachricht durch die Inhaltsseite angepasst werden kann.

Da das Label-Steuerelement als geschützte Membervariable innerhalb der master Seite implementiert ist, kann nicht direkt über Inhaltsseiten darauf zugegriffen werden. Um mit der Bezeichnung innerhalb einer master Seite von der Inhaltsseite (oder in diesem Fall jedes Websteuerelements auf der master-Seite) zu arbeiten, müssen wir eine öffentliche Eigenschaft auf der seite master 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 master Seite die folgende Syntax hinzu, um die Label-Eigenschaft Text verfügbar zu machen:

public string GridMessageText 
{ 
    get
    { 
        return GridMessage.Text; 
    } 
    set 
    {
        GridMessage.Text = value; 
    }
}

Wenn der Products Tabelle von einer Inhaltsseite ein neuer Datensatz hinzugefügt wird, muss gridView RecentProducts in der master Seite erneut an die zugrunde liegende Datenquelle binden. Um die GridView-Methode neu zu binden, rufen Sie die -Methode auf DataBind . Da die GridView auf der seite master für die Inhaltsseiten nicht programmgesteuert zugänglich ist, müssen wir eine öffentliche Methode auf der seite master erstellen, die die Daten beim Aufruf erneut an GridView bindet. Fügen Sie der CodeBehind-Klasse der master Seite die folgende Methode hinzu:

public void RefreshRecentProductsGrid() 
{ 
    RecentProducts.DataBind();
}

Wenn die -Eigenschaft und RefreshRecentProductsGrid die GridMessageText -Methode vorhanden sind, kann jede Inhaltsseite den Wert der GridMessage Label-Eigenschaft Text programmgesteuert festlegen oder lesen oder die Daten erneut an gridView RecentProducts binden. In Schritt 4 wird der Zugriff auf die öffentlichen Eigenschaften und Methoden der master Seite von einer Inhaltsseite aus untersucht.

Hinweis

Vergessen Sie nicht, die Eigenschaften und Methoden der master Seite als zu publicmarkieren. Wenn Sie diese Eigenschaften und Methoden nicht explizit als publicbezeichnen, kann nicht auf die Inhaltsseite zugegriffen werden.

Schritt 4: Aufrufen der öffentlichen Mitglieder der Gestaltungsvorlage von einer Inhaltsseite

Nachdem die seite master 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 master Seite GridMessageText festlegen und deren RefreshRecentProductsGrid Methode aufrufen, nachdem das neue Produkt der Datenbank hinzugefügt wurde. Alle ASP.NET Daten-Websteuerelemente auslösen Ereignisse unmittelbar vor und nach dem Ausführen verschiedener Aufgaben, die es Seitenentwicklern erleichtern, programmgesteuerte Aktionen vor oder nach der Aufgabe auszuführen. Wenn der Endbenutzer beispielsweise auf die Schaltfläche Einfügen von DetailsView klickt, löst die DetailsView beim Postback das -Ereignis aus ItemInserting , bevor der Einfügeworkflow gestartet wird. Anschließend wird der Datensatz in die Datenbank eingefügt. Danach löst die DetailsView ihr ItemInserted -Ereignis aus. Erstellen Sie daher einen Ereignishandler für das Ereignis von DetailsViewItemInserted, um nach dem Hinzufügen des neuen Produkts mit der Seite master zu arbeiten.

Es gibt zwei Möglichkeiten, wie eine Inhaltsseite programmgesteuert mit ihrer master-Seite zusammenarbeiten kann:

  • Mithilfe der Page.Master -Eigenschaft, die einen lose typisierten Verweis auf die seite master zurückgibt, oder
  • Geben Sie den master Seitentyp oder Dateipfad der Seite über eine -Direktive an@MasterType. Dadurch wird der Seite automatisch eine stark typisierte Eigenschaft namens Masterhinzugefügt.

Sehen wir uns beide Ansätze an.

Verwenden der Loosely-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 master Seite der Seite zurückgibt. Wenn die Seite keinen master gibt Master zurücknull.

Die Master -Eigenschaft gibt ein Objekt vom Typ MasterPage (ebenfalls im System.Web.UI Namespace) zurück, bei dem es sich um den Basistyp handelt, von dem alle master Seiten abgeleitet werden. Daher müssen wir das von der -Eigenschaft zurückgegebene Objekt in den MasterPage entsprechenden Typ umwandeln, um öffentliche Eigenschaften oder Methoden zu verwenden, die auf der Master master Seite unserer Website definiert sind. Da wir unsere master-Seitendatei Site.masterbenannt haben, erhielt die CodeBehind-Klasse den Namen Site. Daher wandelt der folgende Code die Page.Master -Eigenschaft in eine instance 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 typisierte Page.Master Eigenschaft in den Site Typ umgewandelt haben, können wir auf die Eigenschaften und Methoden verweisen, die für Site spezifisch sind. Wie abbildung 7 zeigt, wird die öffentliche Eigenschaft GridMessageText in der IntelliSense-Dropdownliste angezeigt.

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

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

Hinweis

Wenn Sie Die master-Seitendatei MasterPage.master benannt haben, lautet MasterPageder CodeBehind-Klassenname der master Seite . Dies kann beim Umwandeln des Typs System.Web.UI.MasterPage in Ihre MasterPage Klasse zu mehrdeutigem Code führen. Kurz gesagt, Sie müssen den Typ, in den Sie umwandeln, vollständig qualifizieren, was bei Verwendung des Websiteprojektmodells etwas schwierig sein kann. Mein Vorschlag wäre, entweder sicherzustellen, dass Sie beim Erstellen Ihrer master Seite einen anderen Namen als MasterPage.master oder, noch besser, einen stark typisierten Verweis auf die master Seite erstellen.

Erstellen eines Strongly-Typed Verweises mit der@MasterType-Direktive

Wenn Sie genau hinsehen, können Sie sehen, dass die CodeBehind-Klasse einer ASP.NET Seite eine partielle Klasse ist (beachten Sie die partial Schlüsselwort (keyword) in der Klassendefinition). Partielle Klassen wurden in C# und Visual Basic with.NET Framework 2.0 eingeführt und ermöglichen kurz gesagt, dass die Member einer Klasse über mehrere Dateien hinweg definiert werden können. Die CodeBehind-Klassendatei – AddProduct.aspx.csz. B. – enthält den Code, den wir als 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 übersetzt.

Die automatische Codegenerierung, die bei jedem Besuch einer ASP.NET Seite erfolgt, ebnet den Weg für einige interessante und nützliche Möglichkeiten. Wenn wir der ASP.NET-Engine im Fall von master Seiten mitteilen, welche master Seite von unserer Inhaltsseite verwendet wird, generiert sie eine stark typisierte Master Eigenschaft für uns.

Verwenden Sie die @MasterType -Anweisung, um die ASP.NET-Engine über den master Seitentyp der Inhaltsseite zu informieren. Die @MasterType -Direktive kann entweder den Typnamen der master-Seite oder den Dateipfad akzeptieren. Um anzugeben, dass die AddProduct.aspx Seite als master Seite verwendetSite.master, fügen Sie die folgende Anweisung am Anfang von AddProduct.aspxhinzu:

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

Diese Direktive weist die ASP.NET-Engine an, über eine Eigenschaft namens Mastereinen stark typisierten Verweis auf die seite master hinzuzufügen. Wenn die @MasterType -Direktive eingerichtet ist, können wir die öffentlichen Eigenschaften und Methoden der Site.master master Seite direkt über die Master -Eigenschaft ohne Umwandlungen aufrufen.

Hinweis

Wenn Sie die @MasterType -Direktive weglassen, geben Sie die Syntax Page.Master und Master dasselbe zurück: ein lose typisiertes Objekt an die master Seite der Seite. Wenn Sie die @MasterType -Direktive einschließen, Master wird ein stark typisierter Verweis auf die angegebene master Seite zurückgegeben. Page.Mastergibt jedoch weiterhin einen lose typisierten Verweis zurück. Einen ausführlicheren Blick darauf, warum dies der Fall ist und wie die Master Eigenschaft erstellt wird, wenn die @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

Nachdem wir nun wissen, wie die öffentlichen Eigenschaften und Methoden einer master Seite von einer Inhaltsseite aufgerufen werden, können wir die AddProduct.aspx Seite aktualisieren, sodass die master Seite nach dem Hinzufügen eines neuen Produkts aktualisiert wird. Zu Beginn von Schritt 4 haben wir einen Ereignishandler für das Ereignis des ItemInserting DetailsView-Steuerelements erstellt, das 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 typisierte Page.Master Eigenschaft als auch die stark typisierte 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 über auf den gerade hinzugefügten ProductName Wert zugegriffen e.Values["ProductName"].

Abbildung 8 zeigt die AddProduct.aspx Seite unmittelbar nach dem Hinzufügen eines neuen Produkts – Scott es Soda – zur Datenbank. Beachten Sie, dass der gerade hinzugefügte Produktname in der Bezeichnung der master Seite notiert ist und dass gridView aktualisiert wurde, um das Produkt und dessen Preis einzuschließen.

Die Beschriftung der Gestaltungsvorlage und GridView zeigen das Just-Added Produkt an.

Abbildung 08: Beschriftung der Gestaltungsvorlage und GridView: Anzeigen des Just-Added Produkts (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Zusammenfassung

Im Idealfall sind eine master Seite und ihre Inhaltsseiten vollständig voneinander getrennt und erfordern keine Interaktionsebene. Obwohl master Seiten und Inhaltsseiten mit diesem Ziel entworfen werden sollten, gibt es eine Reihe von gängigen Szenarien, in denen eine Inhaltsseite mit ihrer master Seite zusammenarbeiten muss. Einer der häufigsten Gründe liegt darin, einen bestimmten Teil der master Seitenanzeige basierend auf einer Aktion zu aktualisieren, die auf der Inhaltsseite aufgetreten ist.

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

Im nächsten Tutorial wird untersucht, wie die master Seite programmgesteuert mit einer ihrer Inhaltsseiten interagiert.

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. Leitender Prüfer für dieses Tutorial war Zack Jones. Möchten Sie meine anstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie mir eine Zeile unter mitchell@4GuysFromRolla.com