Anpassen des Site-Wide Verhaltens für ASP.NET Web Pages Websites (Razor)
von Tom FitzMacken
In diesem Artikel wird erläutert, wie Websiteeinstellungen für Seiten in einer ASP.NET Web Pages -Website (Razor) vorgenommen werden.
Sie lernen Folgendes:
- Ausführen von Code, mit dem Sie Werte (globale Werte oder Hilfseinstellungen) für alle Seiten einer Website festlegen können.
- Ausführen von Code, mit dem Sie Werte für alle Seiten in einem Ordner festlegen können.
- Ausführen von Code vor und nach dem Laden einer Seite.
- So senden Sie Fehler an eine zentrale Fehlerseite.
- Hier erfahren Sie, wie Sie die Authentifizierung allen Seiten in einem Ordner hinzufügen.
Im Tutorial verwendete Softwareversionen
- ASP.NET Web Pages (Razor) 2
- WebMatrix 3
- ASP.NET Webhilfsbibliothek (NuGet-Paket)
Dieses Tutorial funktioniert auch mit ASP.NET Web Pages 3 und Visual Studio 2013 (oder Visual Studio Express 2013 für Web), außer sie können die ASP.NET Webhilfsbibliothek nicht verwenden.
Hinzufügen von Websitestartcode für ASP.NET Web Pages
Für einen Großteil des Codes, den Sie in ASP.NET Web Pages schreiben, kann eine einzelne Seite den gesamten Code enthalten, der für diese Seite erforderlich ist. Wenn beispielsweise eine Seite eine E-Mail-Nachricht sendet, ist es möglich, den gesamten Code für diesen Vorgang auf einer einzelnen Seite zu platzieren. Dies kann den Code enthalten, um die Einstellungen für das Senden von E-Mails (d. h. für den SMTP-Server) und für das Senden der E-Mail-Nachricht zu initialisieren.
In einigen Situationen möchten Sie jedoch möglicherweise Code ausführen, bevor eine Seite auf der Website ausgeführt wird. Dies ist nützlich, um Werte festzulegen, die an einer beliebigen Stelle des Standorts (als globale Werte bezeichnet) verwendet werden können. Einige Hilfsprogramme erfordern z. B. die Angabe von Werten wie E-Mail-Einstellungen oder Kontoschlüsseln. Es kann praktisch sein, diese Einstellungen in globalen Werten beizubehalten.
Dazu können Sie eine Seite mit dem Namen _AppStart.cshtml im Stammverzeichnis der Website erstellen. Wenn diese Seite vorhanden ist, wird sie ausgeführt, wenn eine Seite in der Website zum ersten Mal angefordert wird. Daher ist es ein guter Ort, Code auszuführen, um globale Werte festzulegen. (Da _AppStart.cshtml über ein Unterstrichpräfix verfügt, sendet ASP.NET die Seite auch dann nicht an einen Browser, wenn Benutzer sie direkt anfordern.)
Das folgende Diagramm zeigt, wie die Seite _AppStart.cshtml funktioniert. Wenn eine Anforderung für eine Seite eingeht und dies die erste Anforderung für eine Seite in der Website ist, überprüft ASP.NET zuerst, ob eine _AppStart.cshtml-Seite vorhanden ist. Wenn dies der Fall ist, wird code auf der seite _AppStart.cshtml ausgeführt, und dann wird die angeforderte Seite ausgeführt.
Festlegen globaler Werte für Ihre Website
Erstellen Sie im Stammordner einer WebMatrix-Website eine Datei mit dem Namen _AppStart.cshtml. Die Datei muss sich im Stammverzeichnis der Website befinden.
Ersetzen Sie den vorhandenen Inhalt durch Folgendes:
@{ AppState["customAppName"] = "Application Name"; }
Dieser Code speichert einen Wert im Wörterbuch, der
AppState
automatisch für alle Seiten auf der Website verfügbar ist. Beachten Sie, dass die Datei _AppStart.cshtml kein Markup enthält. Die Seite führt den Code aus und leitet dann zu der ursprünglich angeforderten Seite um.Hinweis
Seien Sie vorsichtig, wenn Sie Code in die Datei _AppStart.cshtml einfügen. Wenn Fehler im Code in der Datei _AppStart.cshtml auftreten, wird die Website nicht gestartet.
Erstellen Sie im Stammordner eine neue Seite mit dem Namen AppName.cshtml.
Ersetzen Sie das Standardmarkup und den Standardcode durch Folgendes:
<!DOCTYPE html> <html> <head> <title>Show Application Name</title> </head> <body> <h1>@AppState["customAppName"]</h1> </body> </html>
Dieser Code extrahiert den Wert aus dem Objekt, den
AppState
Sie auf der Seite _AppStart.cshtml festgelegt haben.Führen Sie die Seite AppName.cshtml in einem Browser aus. (Stellen Sie sicher, dass die Seite im Arbeitsbereich Dateien ausgewählt ist , bevor Sie sie ausführen.) Auf der Seite wird der globale Wert angezeigt.
Festlegen von Werten für Hilfsprogramme
Eine gute Verwendung für die Datei _AppStart.cshtml ist das Festlegen von Werten für Hilfsprogramme, die Sie auf Ihrer Website verwenden und die initialisiert werden müssen. Typische Beispiele sind E-Mail-Einstellungen für das WebMail
Hilfsprogramm sowie die privaten und öffentlichen Schlüssel für den ReCaptcha
Helfer. In fällen wie diesen können Sie die Werte einmal in der _AppStart.cshtml festlegen, und dann sind sie bereits für alle Seiten in Ihrer Website festgelegt.
In diesem Verfahren wird gezeigt, wie Sie Einstellungen global festlegen WebMail
. (Weitere Informationen zur Verwendung des WebMail
Hilfsprogramm finden Sie unter Hinzufügen von Email zu einer ASP.NET Web Pages-Website.)
Fügen Sie der Website die ASP.NET Webhilfsbibliothek wie unter Installieren von Hilfsprogrammen in einer ASP.NET Web Pages-Website beschrieben hinzu, sofern sie noch nicht hinzugefügt wurde.
Wenn Sie noch keine datei _AppStart.cshtml besitzen, erstellen Sie im Stammordner einer Website eine Datei mit dem Namen _AppStart.cshtml.
Fügen Sie der Datei _AppStart.cshtml die folgenden
WebMail
Einstellungen hinzu:@{ // Initialize WebMail helper WebMail.SmtpServer = "your-SMTP-host"; WebMail.SmtpPort = 25; WebMail.UserName = "your-user-name-here"; WebMail.Password = "your-account-password"; WebMail.From = "your-email-address-here"; }
Ändern Sie die folgenden E-Mail-bezogenen Einstellungen im Code:
Legen Sie
your-SMTP-host
auf den Namen des SMTP-Servers fest, auf den Sie Zugriff haben.Legen Sie auf den Benutzernamen für Ihr SMTP-Serverkonto fest
your-user-name-here
.Legen Sie auf das Kennwort für Ihr SMTP-Serverkonto fest
your-account-password
.Legen Sie auf Ihre eigene E-Mail-Adresse fest
your-email-address-here
. Dies ist die E-Mail-Adresse, von der die Nachricht gesendet wird. (Einige E-Mail-Anbieter lassen die Angabe einer anderenFrom
Adresse nicht zu und verwenden Ihren Benutzernamen alsFrom
Adresse.)Weitere Informationen zu SMTP-Einstellungen finden Sie unter Konfigurieren von Email-Einstellungen im Artikel Senden von Email von einer ASP.NET Web Pages -Website (Razor) und Probleme beim Senden von Email im Leitfaden zur Problembehandlung für ASP.NET Web Pages (Razor).
Speichern Sie die Datei _AppStart.cshtml , und schließen Sie sie.
Erstellen Sie im Stammordner einer Website eine neue Seite mit dem Namen TestEmail.cshtml.
Ersetzen Sie den vorhandenen Inhalt durch Folgendes:
@{ var message = ""; try{ if(IsPost){ WebMail.Send( to: Request.Form["emailAddress"], subject: Request.Form["emailSubject"], body:Request.Form["emailBody"] ); message = "Email sent!"; } } catch(Exception ex){ message = "Email could not be sent!"; } } <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Test Email</title> </head> <body> <h1>Test Email</h1> <form method="post"> <p> <label for="emailAddress">Email address:</label> <input type="text" name="emailAddress" /> </p> <p> <label for="emailSubject">Subject:</label> <input type="text" name="emailSubject" /> </p> <p> <label for="emailBody">Text to send:</label><br/> <textarea name="emailBody" rows="6"></textarea> </p> <p><input type="submit" value="Send!" /></p> @if(IsPost){ <p>@message</p> } </form> </body> </html>
Führen Sie die Seite TestEmail.cshtml in einem Browser aus.
Füllen Sie die Felder aus, um sich selbst eine E-Mail-Nachricht zu senden, und klicken Sie dann auf Senden.
Überprüfen Sie Ihre E-Mail, um sicherzustellen, dass Sie die Nachricht erhalten haben.
Der wichtige Teil dieses Beispiels ist, dass die Einstellungen, die Sie normalerweise nicht ändern , wie der Name Ihres SMTP-Servers und Ihre E-Mail-Anmeldeinformationen, in der Datei _AppStart.cshtml festgelegt werden. Auf diese Weise müssen Sie sie nicht auf jeder Seite, auf der Sie E-Mails senden, erneut festlegen. (Wenn Sie diese Einstellungen aus irgendeinem Grund ändern müssen, können Sie sie jedoch einzeln auf einer Seite festlegen.) Auf der Seite legen Sie nur die Werte fest, die sich normalerweise jedes Mal ändern, z. B. den Empfänger und den Text der E-Mail-Nachricht.
Ausführen von Vor- und Nachher-Codedateien in einem Ordner
Genau wie Sie _AppStart.cshtml verwenden können, um Code zu schreiben, bevor Seiten in der Website ausgeführt werden, können Sie Code schreiben, der vor (und nach) einer Seite in einem bestimmten Ordner ausgeführt wird. Dies ist nützlich für Dinge wie das Festlegen derselben Layoutseite für alle Seiten in einem Ordner oder für die Überprüfung, ob ein Benutzer angemeldet ist, bevor eine Seite im Ordner ausgeführt wird.
Für Seiten in bestimmten Ordnern können Sie Code in einer Datei mit dem Namen _PageStart.cshtml erstellen. Das folgende Diagramm zeigt, wie die Seite _PageStart.cshtml funktioniert. Wenn eine Anforderung für eine Seite eingeht, sucht ASP.NET zuerst nach einer _AppStart.cshtml-Seite und führt diese aus. Dann überprüft ASP.NET, ob eine _PageStart.cshtml-Seite vorhanden ist, und führt diese aus, wenn dies der Fall ist. Anschließend wird die angeforderte Seite ausgeführt.
Auf der Seite _PageStart.cshtml können Sie angeben, wo während der Verarbeitung die angeforderte Seite ausgeführt werden soll, indem Sie eine RunPage
-Methode einschließen. Auf diese Weise können Sie Code ausführen, bevor die angeforderte Seite ausgeführt wird und danach erneut. Wenn Sie nicht einschließen RunPage
, wird der gesamte Code in _PageStart.cshtml ausgeführt, und die angeforderte Seite wird automatisch ausgeführt.
mit ASP.NET können Sie eine Hierarchie von _PageStart.cshtml-Dateien erstellen. Sie können eine _PageStart.cshtml-Datei im Stammverzeichnis der Website und in einem beliebigen Unterordner ablegen. Wenn eine Seite angefordert wird, wird die Datei _PageStart.cshtml auf der obersten Ebene (am nächsten zum Websitestamm) ausgeführt, gefolgt von der Datei _PageStart.cshtml im nächsten Unterordner und so weiter unten in der Unterordnerstruktur, bis die Anforderung den Ordner erreicht, der die angeforderte Seite enthält. Nachdem alle anwendbaren _PageStart.cshtml-Dateien ausgeführt wurden, wird die angeforderte Seite ausgeführt.
Sie können beispielsweise die folgende Kombination aus _PageStart.cshtml-Dateien und der Datei Default.cshtml verwenden:
@* ~/_PageStart.cshtml *@
@{
PageData["Color1"] = "Red";
PageData["Color2"] = "Blue";
}
@* ~/myfolder/_PageStart.cshtml *@
@{
PageData["Color2"] = "Yellow";
PageData["Color3"] = "Green";
}
@* ~/myfolder/default.cshtml *@
@PageData["Color1"]
<br/>
@PageData["Color2"]
<br/>
@PageData["Color3"]
Wenn Sie /myfolder/default.cshtml ausführen, wird Folgendes angezeigt:
Red
Yellow
Green
Ausführen von Initialisierungscode für alle Seiten in einem Ordner
Eine gute Verwendung für _PageStart.cshtml-Dateien ist das Initialisieren derselben Layoutseite für alle Dateien in einem einzelnen Ordner.
Erstellen Sie im Stammordner einen neuen Ordner mit dem Namen InitPages.
Erstellen Sie im Ordner InitPages Ihrer Website eine Datei mit dem Namen _PageStart.cshtml , und ersetzen Sie das Standardmarkup und den Standardcode durch Folgendes:
@{ // Sets the layout page for all pages in the folder. Layout = "~/Shared/_Layout1.cshtml"; // Sets a variable available to all pages in the folder. PageData["MyBackground"] = "Yellow"; }
Erstellen Sie im Stammverzeichnis der Website einen Ordner mit dem Namen Shared.
Erstellen Sie im Ordner Freigegeben eine Datei mit dem Namen _Layout1.cshtml , und ersetzen Sie das Standardmarkup und den Standardcode durch Folgendes:
@{ var backgroundColor = PageData["MyBackground"]; } <!DOCTYPE html> <html> <head> <title>Page Title</title> <link type="text/css" href="/Styles/Site.css" rel="stylesheet" /> </head> <body> <div id="header"> Using the _PageStart.cshtml file </div> <div id="main" style="background-color:@backgroundColor"> @RenderBody() </div> <div id="footer"> © 2012 Contoso. All rights reserved </div> </body> </html>
Erstellen Sie im Ordner InitPages eine Datei mit dem Namen Content1.cshtml , und ersetzen Sie den vorhandenen Inhalt durch Folgendes:
<p>This is content page 1.</p>
Erstellen Sie im Ordner InitPages eine weitere Datei mit dem Namen Content2.cshtml , und ersetzen Sie das Standardmarkup durch Folgendes:
<p>This is content page 2.</p>
Führen Sie Content1.cshtml in einem Browser aus.
Wenn die Seite Content1.cshtml ausgeführt wird, wird die Datei _PageStart.cshtml festgelegt
Layout
und auch auf eine Farbe festgelegtPageData["MyBackground"]
. In Content1.cshtml werden das Layout und die Farbe angewendet.Anzeigen von Content2.cshtml in einem Browser.
Das Layout ist identisch, da beide Seiten die gleiche Layoutseite und Farbe wie in _PageStart.cshtml initialisiert verwenden.
Verwenden von _PageStart.cshtml zum Behandeln von Fehlern
Eine weitere gute Verwendung für die Datei _PageStart.cshtml besteht darin, eine Möglichkeit zum Behandeln von Programmierfehlern (Ausnahmen) zu erstellen, die in jeder CSHTML-Seite in einem Ordner auftreten können. Dieses Beispiel zeigt Ihnen eine Möglichkeit, dies zu tun.
Erstellen Sie im Stammordner einen Ordner mit dem Namen InitCatch.
Erstellen Sie im Ordner InitCatch Ihrer Website eine Datei mit dem Namen _PageStart.cshtml , und ersetzen Sie das vorhandene Markup und den code durch Folgendes:
@{ try { RunPage(); } catch (Exception ex) { Response.Redirect("~/Error.cshtml?source=" + HttpUtility.UrlEncode(Request.AppRelativeCurrentExecutionFilePath)); } }
In diesem Code versuchen Sie, die angeforderte Seite explizit auszuführen, indem Sie die
RunPage
-Methode in einemtry
Block aufrufen. Wenn auf der angeforderten Seite Programmierfehler auftreten, wird der Code imcatch
Block ausgeführt. In diesem Fall leitet der Code an eine Seite (Error.cshtml) um und übergibt den Namen der Datei, bei der der Fehler aufgetreten ist, als Teil der URL. (Sie erstellen die Seite in Kürze.)Erstellen Sie im Ordner InitCatch Ihrer Website eine Datei namens Exception.cshtml , und ersetzen Sie das vorhandene Markup und den code durch Folgendes:
@{ var db = Database.Open("invalidDatabaseFile"); }
In diesem Beispiel erstellen Sie auf dieser Seite absichtlich einen Fehler, indem Sie versuchen, eine Datenbankdatei zu öffnen, die nicht vorhanden ist.
Erstellen Sie im Stammordner eine Datei mit dem Namen Error.cshtml , und ersetzen Sie das vorhandene Markup und den vorhandenen Code durch Folgendes:
<!DOCTYPE html> <html> <head> <title>Error Page</title> </head> <body> <h1>Error report</h1> <p>An error occurred while running the following file: @Request["source"]</p> </body> </html>
Auf dieser Seite ruft der Ausdruck
@Request["source"]
den Wert aus der URL ab und zeigt ihn an.Klicken Sie auf der Symbolleiste auf Speichern.
Führen Sie Exception.cshtml in einem Browser aus.
Da in Exception.cshtml ein Fehler auftritt, leitet die Seite _PageStart.cshtml zur Datei Error.cshtml um, in der die Meldung angezeigt wird.
Weitere Informationen zu Ausnahmen finden Sie unter Einführung in ASP.NET Web Pages Programmierung mithilfe der Razor-Syntax.
Verwenden von _PageStart.cshtml zum Einschränken des Ordnerzugriffs
Sie können auch die Datei _PageStart.cshtml verwenden, um den Zugriff auf alle Dateien in einem Ordner einzuschränken.
Erstellen Sie in WebMatrix mithilfe der Option Website aus Vorlage eine neue Website.
Wählen Sie in den verfügbaren Vorlagen starter Site aus.
Erstellen Sie im Stammordner einen Ordner mit dem Namen AuthenticatedContent.
Erstellen Sie im Ordner AuthenticatedContent eine Datei mit dem Namen _PageStart.cshtml , und ersetzen Sie das vorhandene Markup und den vorhandenen Code durch Folgendes:
@{ Response.CacheControl = "no-cache"; if (!WebSecurity.IsAuthenticated) { var returnUrl = "~/Account/Login?ReturnUrl=" + Request.Url.LocalPath; Response.Redirect(returnUrl); } }
Der Code verhindert zunächst, dass alle Dateien im Ordner zwischengespeichert werden. (Dies ist für Szenarien wie öffentliche Computer erforderlich, bei denen die zwischengespeicherten Seiten eines Benutzers nicht für den nächsten Benutzer verfügbar sein sollen.) Als Nächstes bestimmt der Code, ob sich der Benutzer bei der Website angemeldet hat, bevor er eine der Seiten im Ordner anzeigen kann. Wenn der Benutzer nicht angemeldet ist, wird der Code zur Anmeldeseite weitergeleitet. Die Anmeldeseite kann dem Benutzer die ursprünglich angeforderte Seite zurückgeben, wenn Sie einen Abfragezeichenfolgenwert namens
ReturnUrl
einschließen.Erstellen Sie eine neue Seite im Ordner AuthenticatedContent mit dem Namen Page.cshtml.
Ersetzen Sie das Standardmarkup durch Folgendes:
@{ Layout = "~/_SiteLayout.cshtml"; Page.Title = "Authenticated Content"; } <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> Thank you for authenticating! </body> </html>
Führen Sie Page.cshtml in einem Browser aus. Der Code leitet Sie zu einer Anmeldeseite weiter. Sie müssen sich registrieren, bevor Sie sich anmelden. Nachdem Sie sich registriert und angemeldet haben, können Sie zur Seite navigieren und deren Inhalt anzeigen.
Zusätzliche Ressourcen
Einführung in die ASP.NET Web Pages Programmierung mithilfe der Razor-Syntax