Dostosowywanie zachowania Site-Wide dla witryn ASP.NET Web Pages (Razor)
– autor Tom FitzMacken
W tym artykule wyjaśniono, jak ustawić ustawienia po stronie witryny dla stron w witrynie internetowej ASP.NET Web Pages (Razor).
Zawartość:
- Jak uruchomić kod, który pozwala ustawić wartości (wartości globalne lub ustawienia pomocnika) dla wszystkich stron w witrynie.
- Jak uruchomić kod, który umożliwia ustawianie wartości dla wszystkich stron w folderze.
- Jak uruchomić kod przed załadowaniem strony i po jej załadowaniu.
- Jak wysyłać błędy do centralnej strony błędu.
- Jak dodać uwierzytelnianie do wszystkich stron w folderze.
Wersje oprogramowania używane w samouczku
- ASP.NET Web Pages (Razor) 2
- WebMatrix 3
- biblioteka pomocników sieci Web ASP.NET (pakiet NuGet)
Ten samouczek działa również z programem ASP.NET Web Pages 3 i Visual Studio 2013 (lub Visual Studio Express 2013 for Web), z wyjątkiem używania biblioteki pomocników sieci Web ASP.NET.
Dodawanie kodu uruchamiania witryny sieci Web dla stron sieci Web ASP.NET
W przypadku większości kodu pisanego w ASP.NET stron sieci Web pojedyncza strona może zawierać cały kod wymagany dla tej strony. Jeśli na przykład strona wysyła wiadomość e-mail, można umieścić cały kod dla tej operacji na jednej stronie. Może to obejmować kod inicjowania ustawień wysyłania wiadomości e-mail (czyli serwera SMTP) i wysyłania wiadomości e-mail.
Jednak w niektórych sytuacjach może być konieczne uruchomienie kodu przed uruchomieniem dowolnej strony w witrynie. Jest to przydatne w przypadku ustawiania wartości, które mogą być używane w dowolnym miejscu w witrynie (określane jako wartości globalne). Na przykład niektórzy pomocnicy wymagają podania wartości, takich jak ustawienia poczty e-mail lub klucze konta. Może to być przydatne, aby zachować te ustawienia w wartościach globalnych.
Możesz to zrobić, tworząc stronę o nazwie _AppStart.cshtml w katalogu głównym witryny. Jeśli ta strona istnieje, jest uruchamiana po raz pierwszy każda strona w witrynie jest żądana. W związku z tym dobrym miejscem jest uruchamianie kodu w celu ustawienia wartości globalnych. (Ponieważ _AppStart.cshtml ma prefiks podkreślenia, ASP.NET nie wyśle strony do przeglądarki, nawet jeśli użytkownicy zażądają jej bezpośrednio.
Na poniższym diagramie pokazano, jak działa strona _AppStart.cshtml . Gdy żądanie pojawi się na stronie, a jeśli jest to pierwsze żądanie dla dowolnej strony w witrynie, ASP.NET najpierw sprawdza, czy istnieje strona _AppStart.cshtml . Jeśli tak, zostanie uruchomiony dowolny kod na stronie _AppStart.cshtml , a następnie zostanie uruchomiona żądana strona.
Ustawianie wartości globalnych dla witryny internetowej
W folderze głównym witryny sieci Web WebMatrix utwórz plik o nazwie _AppStart.cshtml. Plik musi znajdować się w katalogu głównym witryny.
Zastąp istniejącą zawartość następującym kodem:
@{ AppState["customAppName"] = "Application Name"; }
Ten kod przechowuje wartość w słowniku
AppState
, która jest automatycznie dostępna dla wszystkich stron w witrynie. Zwróć uwagę, że plik _AppStart.cshtml nie ma w nim żadnych znaczników. Na stronie zostanie uruchomiony kod, a następnie nastąpi przekierowanie do strony, która została pierwotnie zażądana.Uwaga
Podczas umieszczania kodu w pliku _AppStart.cshtml należy zachować ostrożność. Jeśli wystąpią błędy w kodzie w pliku _AppStart.cshtml , witryna internetowa nie zostanie uruchomiona.
W folderze głównym utwórz nową stronę o nazwie AppName.cshtml.
Zastąp domyślną adiustację i kod następującym kodem:
<!DOCTYPE html> <html> <head> <title>Show Application Name</title> </head> <body> <h1>@AppState["customAppName"]</h1> </body> </html>
Ten kod wyodrębnia wartość z obiektu ustawionego
AppState
na stronie _AppStart.cshtml .Uruchom stronę AppName.cshtml w przeglądarce. (Przed uruchomieniem strony upewnij się, że strona jest zaznaczona w obszarze roboczym Pliki ). Na stronie zostanie wyświetlona wartość globalna.
Ustawianie wartości dla pomocników
Dobrym zastosowaniem dla pliku _AppStart.cshtml jest ustawienie wartości dla pomocników używanych w witrynie i które należy zainicjować. Typowe przykłady to ustawienia poczty e-mail dla WebMail
pomocnika oraz kluczy prywatnych i publicznych dla ReCaptcha
pomocnika. W takich przypadkach można ustawić wartości raz w pliku _AppStart.cshtml , a następnie są one już ustawione dla wszystkich stron w witrynie.
Ta procedura pokazuje, jak ustawić WebMail
ustawienia globalnie. (Aby uzyskać więcej informacji na temat korzystania z WebMail
pomocnika, zobacz Dodawanie Email do witryny ASP.NET Web Pages).
Dodaj bibliotekę ASP.NET Web Helpers Library do witryny sieci Web zgodnie z opisem w temacie Instalowanie pomocników w witrynie ASP.NET Web Pages, jeśli jeszcze jej nie dodano.
Jeśli nie masz jeszcze pliku _AppStart.cshtml , w folderze głównym witryny internetowej utwórz plik o nazwie _AppStart.cshtml.
Dodaj następujące
WebMail
ustawienia do pliku _AppStart.cshtml :@{ // 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"; }
Zmodyfikuj następujące ustawienia związane z pocztą e-mail w kodzie:
Ustaw
your-SMTP-host
nazwę serwera SMTP, do którego masz dostęp.Ustaw
your-user-name-here
wartość na nazwę użytkownika dla konta serwera SMTP.Ustaw
your-account-password
hasło dla konta serwera SMTP.Ustaw
your-email-address-here
na własny adres e-mail. Jest to adres e-mail, z którego jest wysyłana wiadomość. (Niektórzy dostawcy poczty e-mail nie pozwalają określić innegoFrom
adresu i będą używać nazwy użytkownika jakoFrom
adresu).Aby uzyskać więcej informacji na temat ustawień protokołu SMTP, zobacz Konfigurowanie ustawień Email w artykule Wysyłanie Email z witryny ASP.NET Web Pages (Razor) i problemy z wysyłaniem Email w przewodniku rozwiązywania problemów ze stronami sieci Web (Razor) ASP.NET.
Zapisz plik _AppStart.cshtml i zamknij go.
W folderze głównym witryny internetowej utwórz nową stronę o nazwie TestEmail.cshtml.
Zastąp istniejącą zawartość następującym kodem:
@{ 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>
Uruchom stronę TestEmail.cshtml w przeglądarce.
Wypełnij pola, aby wysłać sobie wiadomość e-mail, a następnie kliknij przycisk Wyślij.
Sprawdź swoją wiadomość e-mail, aby upewnić się, że wiadomość została wysłana.
Ważną częścią tego przykładu jest to, że ustawienia, które zwykle nie są zmieniane — takie jak nazwa serwera SMTP i poświadczenia poczty e-mail — są ustawiane w pliku _AppStart.cshtml . W ten sposób nie trzeba ustawiać ich ponownie na każdej stronie, na której wysyłasz wiadomości e-mail. (Jeśli z jakiegoś powodu musisz zmienić te ustawienia, możesz je ustawić indywidualnie na stronie). Na stronie ustawiasz tylko wartości, które zwykle zmieniają się za każdym razem, takie jak odbiorca i treść wiadomości e-mail.
Uruchamianie kodu przed i po plikach w folderze
Tak jak można użyć _AppStart.cshtml do pisania kodu przed stronami w uruchomieniu witryny, można napisać kod uruchamiany przed (i po) dowolnej stronie w określonym folderze. Jest to przydatne w przypadku takich rzeczy, jak ustawienie tej samej strony układu dla wszystkich stron w folderze lub sprawdzenie, czy użytkownik jest zalogowany przed uruchomieniem strony w folderze.
W przypadku stron w określonych folderach można utworzyć kod w pliku o nazwie _PageStart.cshtml. Na poniższym diagramie przedstawiono sposób działania strony _PageStart.cshtml . Gdy żądanie zostanie wyświetlone dla strony, ASP.NET najpierw wyszuka stronę _AppStart.cshtml i uruchomi je. Następnie ASP.NET sprawdza, czy istnieje strona _PageStart.cshtml , a jeśli tak, uruchomi to. Następnie uruchamia żądaną stronę.
Wewnątrz strony _PageStart.cshtml można określić, gdzie podczas przetwarzania żądana strona ma być uruchamiana przez dołączenie RunPage
metody. Dzięki temu można uruchomić kod przed uruchomieniem żądanej strony, a następnie ponownie po niej. Jeśli nie dołączysz RunPage
pliku , cały kod w pliku _PageStart.cshtml zostanie uruchomiony automatycznie, a żądana strona zostanie uruchomiona automatycznie.
ASP.NET umożliwia utworzenie hierarchii plików _PageStart.cshtml . Plik _PageStart.cshtml można umieścić w katalogu głównym witryny i w dowolnym podfolderze. Po żądaniu strony zostanie uruchomiony plik _PageStart.cshtml na najwyższym poziomie (najbliżej katalogu głównego witryny), a następnie plik _PageStart.cshtml w następnym podfolderze i tak dalej w dół struktury podfolderu, dopóki żądanie nie dotrze do folderu zawierającego żądaną stronę. Po uruchomieniu wszystkich odpowiednich plików _PageStart.cshtml żądana strona zostanie uruchomiona.
Na przykład może istnieć następująca kombinacja plików _PageStart.cshtml i pliku Default.cshtml :
@* ~/_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"]
Po uruchomieniu pliku /myfolder/default.cshtml zobaczysz następujące elementy:
Red
Yellow
Green
Uruchamianie kodu inicjowania dla wszystkich stron w folderze
Dobrym rozwiązaniem w przypadku plików _PageStart.cshtml jest zainicjowanie tej samej strony układu dla wszystkich plików w jednym folderze.
W folderze głównym utwórz nowy folder o nazwie InitPages.
W folderze InitPages witryny internetowej utwórz plik o nazwie _PageStart.cshtml i zastąp domyślny znacznik i kod następującym kodem:
@{ // 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"; }
W katalogu głównym witryny internetowej utwórz folder o nazwie Udostępnione.
W folderze Udostępnione utwórz plik o nazwie _Layout1.cshtml i zastąp domyślny znacznik i kod następującym kodem:
@{ 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>
W folderze InitPages utwórz plik o nazwie Content1.cshtml i zastąp istniejącą zawartość następującym kodem:
<p>This is content page 1.</p>
W folderze InitPages utwórz inny plik o nazwie Content2.cshtml i zastąp domyślny znacznik następującym kodem:
<p>This is content page 2.</p>
Uruchom plik Content1.cshtml w przeglądarce.
Po uruchomieniu strony Content1.cshtml zestawy
Layout
plików _PageStart.cshtml, a także ustawiająPageData["MyBackground"]
kolor. W pliku Content1.cshtml zastosowano układ i kolor.Wyświetl plik Content2.cshtml w przeglądarce.
Układ jest taki sam, ponieważ obie strony używają tej samej strony układu i koloru, co zainicjowane w pliku _PageStart.cshtml.
Używanie pliku _PageStart.cshtml do obsługi błędów
Innym dobrym zastosowaniem dla pliku _PageStart.cshtml jest utworzenie sposobu obsługi błędów programowania (wyjątków), które mogą wystąpić na dowolnej stronie cshtml w folderze. W tym przykładzie pokazano jeden ze sposobów, aby to zrobić.
W folderze głównym utwórz folder o nazwie InitCatch.
W folderze InitCatch witryny internetowej utwórz plik o nazwie _PageStart.cshtml i zastąp istniejący znacznik i kod następującym kodem:
@{ try { RunPage(); } catch (Exception ex) { Response.Redirect("~/Error.cshtml?source=" + HttpUtility.UrlEncode(Request.AppRelativeCurrentExecutionFilePath)); } }
W tym kodzie spróbujesz jawnie uruchomić żądaną stronę, wywołując metodę
RunPage
try
wewnątrz bloku. Jeśli na żądanej stronie wystąpią jakiekolwiek błędy programowania, kod wewnątrzcatch
bloku jest uruchamiany. W takim przypadku kod przekierowuje do strony (Error.cshtml) i przekazuje nazwę pliku, który napotkał błąd w ramach adresu URL. (Wkrótce utworzysz stronę).W folderze InitCatch witryny internetowej utwórz plik o nazwie Exception.cshtml i zastąp istniejący znacznik i kod następującym kodem:
@{ var db = Database.Open("invalidDatabaseFile"); }
Na potrzeby tego przykładu to, co robisz na tej stronie, celowo tworzy błąd, próbując otworzyć plik bazy danych, który nie istnieje.
W folderze głównym utwórz plik o nazwie Error.cshtml i zastąp istniejący znacznik i kod następującym kodem:
<!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>
Na tej stronie wyrażenie
@Request["source"]
pobiera wartość z adresu URL i wyświetla ją.Na pasku narzędzi kliknij pozycję Zapisz.
Uruchom plik Exception.cshtml w przeglądarce.
Ponieważ błąd występuje w pliku Exception.cshtml, strona _PageStart.cshtml przekierowuje do pliku Error.cshtml , który wyświetla komunikat.
Aby uzyskać więcej informacji na temat wyjątków, zobacz Wprowadzenie do programowania ASP.NET stron internetowych przy użyciu składni Razor.
Używanie pliku _PageStart.cshtml do ograniczania dostępu do folderów
Możesz również użyć pliku _PageStart.cshtml , aby ograniczyć dostęp do wszystkich plików w folderze.
W programie WebMatrix utwórz nową witrynę internetową przy użyciu opcji Witryna z szablonu .
Z dostępnych szablonów wybierz pozycję Witryna startowa.
W folderze głównym utwórz folder o nazwie AuthenticatedContent.
W folderze AuthenticatedContent utwórz plik o nazwie _PageStart.cshtml i zastąp istniejący znacznik i kod następującym kodem:
@{ Response.CacheControl = "no-cache"; if (!WebSecurity.IsAuthenticated) { var returnUrl = "~/Account/Login?ReturnUrl=" + Request.Url.LocalPath; Response.Redirect(returnUrl); } }
Kod rozpoczyna się od uniemożliwienia buforowania wszystkich plików w folderze. (Jest to wymagane w scenariuszach, takich jak komputery publiczne, gdzie nie chcesz, aby strony z pamięci podręcznej jednego użytkownika było dostępne dla następnego użytkownika). Następnie kod określa, czy użytkownik zalogował się do witryny, zanim będzie mógł wyświetlić dowolne strony w folderze. Jeśli użytkownik nie jest zalogowany, kod przekierowuje do strony logowania. Strona logowania może zwrócić użytkownika do strony, której pierwotnie zażądano, jeśli dołączysz wartość ciągu zapytania o nazwie
ReturnUrl
.Utwórz nową stronę w folderze AuthenticationdContent o nazwie Page.cshtml.
Zastąp znacznik domyślny następującym kodem:
@{ Layout = "~/_SiteLayout.cshtml"; Page.Title = "Authenticated Content"; } <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> Thank you for authenticating! </body> </html>
Uruchom plik Page.cshtml w przeglądarce. Kod przekierowuje Cię do strony logowania. Przed zalogowaniem należy się zarejestrować. Po zarejestrowaniu i zalogowaniu możesz przejść do strony i wyświetlić jego zawartość.
Dodatkowe zasoby
Wprowadzenie do programowania ASP.NET stron internetowych przy użyciu składni Razor