Udostępnij za pośrednictwem


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.

[Obraz pokazuje, jak działa aplikacja App Star dot CSHTML.]

Ustawianie wartości globalnych dla witryny internetowej

  1. W folderze głównym witryny sieci Web WebMatrix utwórz plik o nazwie _AppStart.cshtml. Plik musi znajdować się w katalogu głównym witryny.

  2. 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.

  3. W folderze głównym utwórz nową stronę o nazwie AppName.cshtml.

  4. 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 .

  5. 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.

    [Zrzut ekranu przedstawia stronę wyświetlającą wartość globalną.]

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).

  1. 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.

  2. Jeśli nie masz jeszcze pliku _AppStart.cshtml , w folderze głównym witryny internetowej utwórz plik o nazwie _AppStart.cshtml.

  3. 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:

  4. Zapisz plik _AppStart.cshtml i zamknij go.

  5. W folderze głównym witryny internetowej utwórz nową stronę o nazwie TestEmail.cshtml.

  6. 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>
    
  7. Uruchom stronę TestEmail.cshtml w przeglądarce.

  8. Wypełnij pola, aby wysłać sobie wiadomość e-mail, a następnie kliknij przycisk Wyślij.

  9. 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 RunPagepliku , cały kod w pliku _PageStart.cshtml zostanie uruchomiony automatycznie, a żądana strona zostanie uruchomiona automatycznie.

[Obraz pokazuje, jak żądana strona będzie uruchamiana 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.

  1. W folderze głównym utwórz nowy folder o nazwie InitPages.

  2. 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";
    }
    
  3. W katalogu głównym witryny internetowej utwórz folder o nazwie Udostępnione.

  4. 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">
      &copy; 2012 Contoso. All rights reserved
    </div>
    </body>
    </html>
    
  5. 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>
    
  6. 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>
    
  7. Uruchom plik Content1.cshtml w przeglądarce.

    [Obraz przedstawia uruchomioną zawartość 1 dot 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.

  8. 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ć.

  1. W folderze głównym utwórz folder o nazwie InitCatch.

  2. 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ę RunPagetry wewnątrz bloku. Jeśli na żądanej stronie wystąpią jakiekolwiek błędy programowania, kod wewnątrz catch 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ę).

  3. 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.

  4. 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ą.

  5. Na pasku narzędzi kliknij pozycję Zapisz.

  6. Uruchom plik Exception.cshtml w przeglądarce.

    [Zrzut ekranu przedstawiający uruchamianie wyjątku dot 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.

  1. W programie WebMatrix utwórz nową witrynę internetową przy użyciu opcji Witryna z szablonu .

  2. Z dostępnych szablonów wybierz pozycję Witryna startowa.

  3. W folderze głównym utwórz folder o nazwie AuthenticatedContent.

  4. 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.

  5. Utwórz nową stronę w folderze AuthenticationdContent o nazwie Page.cshtml.

  6. 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>
    
  7. 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