Sdílet prostřednictvím


Přizpůsobení chování Site-Wide pro weby ASP.NET Web Pages (Razor)

, autor: Tom FitzMacken

Tento článek vysvětluje, jak nastavit na straně webu stránky na webu ASP.NET Web Pages (Razor).

Naučíte se:

  • Jak spustit kód, který umožňuje nastavit hodnoty (globální hodnoty nebo nastavení pomocné rutiny) pro všechny stránky na webu.
  • Jak spustit kód, který umožňuje nastavit hodnoty pro všechny stránky ve složce.
  • Jak spustit kód před načtením stránky a po jejím načtení.
  • Odeslání chyb na centrální chybovou stránku
  • Postup přidání ověřování na všechny stránky ve složce

Verze softwaru použité v tomto kurzu

  • ASP.NET webové stránky (Razor) 2
  • WebMatrix 3
  • knihovna webových pomocných rutin ASP.NET (balíček NuGet)

Tento kurz funguje také s webovými stránkami ASP.NET 3 a Visual Studio 2013 (nebo Visual Studio Express 2013 pro web), s tím rozdílem, že nemůžete použít knihovnu webových pomocníků ASP.NET.

Přidání spouštěcího kódu webu pro webové stránky ASP.NET

U velké části kódu, který napíšete na ASP.NET webových stránkách, může jednotlivá stránka obsahovat veškerý kód, který je pro danou stránku potřeba. Pokud například stránka odešle e-mailovou zprávu, je možné vložit veškerý kód pro danou operaci na jednu stránku. To může zahrnovat kód pro inicializaci nastavení pro odesílání e-mailů (tj. pro server SMTP) a pro odesílání e-mailové zprávy.

V některých situacích ale můžete chtít spustit nějaký kód předtím, než se spustí jakákoli stránka na webu. To je užitečné pro nastavení hodnot, které lze použít kdekoli v lokalitě (označované jako globální hodnoty). Někteří pomocníci například vyžadují, abyste zadali hodnoty, jako jsou nastavení e-mailu nebo klíče účtu. Může být užitečné zachovat tato nastavení v globálních hodnotách.

Můžete to udělat tak, že v kořenovém adresáři webu vytvoříte stránku s názvem _AppStart.cshtml . Pokud tato stránka existuje, spustí se při prvním vyžádání jakékoli stránky na webu. Proto je vhodné spustit kód pro nastavení globálních hodnot. (Vzhledem k tomu, že _AppStart.cshtml má předponu podtržítka, ASP.NET neodešle stránku do prohlížeče ani v případě, že o ni uživatelé požadují přímo.)

Následující diagram znázorňuje fungování stránky _AppStart.cshtml . Když přijde žádost o stránku a jedná se o první požadavek na libovolnou stránku na webu, ASP.NET nejprve zkontroluje, zda existuje stránka _AppStart.cshtml . Pokud ano, spustí se jakýkoli kód na stránce _AppStart.cshtml a pak se spustí požadovaná stránka.

[Obrázek ukazuje, jak funguje csHTML tečka app star.]

Nastavení globálních hodnot pro web

  1. V kořenové složce webu WebMatrix vytvořte soubor s názvem _AppStart.cshtml. Soubor musí být v kořenovém adresáři webu.

  2. Stávající obsah nahraďte následujícím kódem:

    @{
      AppState["customAppName"] = "Application Name";
    }
    

    Tento kód ukládá hodnotu ve slovníku AppState , která je automaticky k dispozici pro všechny stránky na webu. Všimněte si, že soubor _AppStart.cshtml neobsahuje žádné značky. Stránka spustí kód a pak přesměruje na stránku, která byla původně požadována.

    Poznámka

    Při vložení kódu do souboru _AppStart.cshtml buďte opatrní. Pokud v kódu v souboru _AppStart.cshtml dojde k nějakým chybám, web se nespustí.

  3. V kořenové složce vytvořte novou stránku s názvem AppName.cshtml.

  4. Nahraďte výchozí kód a kód následujícím kódem:

    <!DOCTYPE html>
    <html>
        <head>
            <title>Show Application Name</title>
        </head>
        <body>
            <h1>@AppState["customAppName"]</h1>
        </body>
    </html>
    

    Tento kód extrahuje hodnotu z objektu AppState , který jste nastavili na stránce _AppStart.cshtml .

  5. V prohlížeči spusťte stránku AppName.cshtml . (Než stránku spustíte, ujistěte se, že je v pracovním prostoru Soubory vybraná.) Na stránce se zobrazí globální hodnota.

    [Snímek obrazovky se stránkou zobrazující globální hodnotu.]

Nastavení hodnot pro pomocné rutiny

Pro soubor _AppStart.cshtml je vhodné nastavit hodnoty pomocných rutin, které používáte na webu a které je třeba inicializovat. Typickými příklady jsou nastavení e-mailu pro WebMail pomocníka a privátní a veřejné klíče pomocníka ReCaptcha . V takových případech můžete hodnoty nastavit jednou v souboru _AppStart.cshtml a pak už jsou nastavené pro všechny stránky na vašem webu.

Tento postup ukazuje, jak nastavit WebMail nastavení globálně. (Další informace o použití pomocné rutiny najdete v WebMail tématu Přidání Email na web ASP.NET webových stránek.)

  1. Přidejte na web knihovnu pomocníků ASP.NET webu, jak je popsáno v tématu Instalace pomocných rutin na webu ASP.NET webových stránek, pokud jste ji ještě nepřidali.

  2. Pokud ještě nemáte soubor _AppStart.cshtml , vytvořte v kořenové složce webu soubor s názvem _AppStart.cshtml.

  3. Do souboru _AppStart.cshtml přidejte následující WebMail nastavení:

    @{
         // 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";
    }
    

    Upravte v kódu následující nastavení související s e-mailem:

  4. Uložte soubor _AppStart.cshtml a zavřete ho.

  5. V kořenové složce webu vytvořte novou stránku s názvem TestEmail.cshtml.

  6. Stávající obsah nahraďte následujícím kódem:

    @{
        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. Spusťte stránku TestEmail.cshtml v prohlížeči.

  8. Vyplňte pole, abyste si poslali e-mailovou zprávu, a klikněte na Odeslat.

  9. Zkontrolujte e-mail a ujistěte se, že jste zprávu dostali.

Důležitou součástí tohoto příkladu je, že nastavení, která obvykle neměníte – například název serveru SMTP a přihlašovací údaje k e-mailu – jsou nastavena v souboru _AppStart.cshtml . Nemusíte je tak znovu nastavovat na každé stránce, kam posíláte e-maily. (I když z nějakého důvodu potřebujete tato nastavení změnit, můžete je nastavit jednotlivě na stránce.) Na stránce nastavíte jenom hodnoty, které se obvykle pokaždé mění, například příjemce a text e-mailové zprávy.

Spuštění kódu před a za soubory ve složce

Stejně jako můžete použít _AppStart.cshtml k zápisu kódu před spuštěním stránek webu, můžete psát kód, který běží před (a po) jakékoli stránce v konkrétní složce. To je užitečné například pro nastavení stejné stránky rozložení pro všechny stránky ve složce nebo pro kontrolu, že je uživatel přihlášený před spuštěním stránky ve složce.

Pro stránky v konkrétních složkách můžete vytvořit kód v souboru s názvem _PageStart.cshtml. Následující diagram znázorňuje fungování stránky _PageStart.cshtml . Když přijde žádost o stránku, ASP.NET nejprve zkontroluje stránku _AppStart.cshtml a spustí ji. Pak ASP.NET zkontroluje, jestli existuje stránka _PageStart.cshtml , a pokud ano, spustí ji. Potom spustí požadovanou stránku.

Na stránce _PageStart.cshtml můžete určit, kde má být během zpracování požadovaná stránka spuštěna, včetně RunPage metody. To vám umožní spustit kód před spuštěním požadované stránky a pak znovu po ní. Pokud nezadáte RunPage, spustí se veškerý kód v souboru _PageStart.cshtml a požadovaná stránka se spustí automaticky.

[Obrázek ukazuje, jak se požadovaná stránka spustí automaticky.]

ASP.NET umožňuje vytvořit hierarchii souborů _PageStart.cshtml . Soubor _PageStart.cshtml můžete vložit do kořenového adresáře webu a do libovolné podsložky. Při vyžádání stránky se spustí soubor _PageStart.cshtml na nejvyšší úrovni (nejblíže ke kořenovému adresáři webu), potom soubor _PageStart.cshtml v další podsložce a tak dále ve struktuře podsložek, dokud požadavek nedosáhne složky, která obsahuje požadovanou stránku. Po spuštění všech příslušných souborů _PageStart.cshtml se požadovaná stránka spustí.

Můžete mít například následující kombinaci souborů _PageStart.cshtml a 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"]

Při spuštění souboru /myfolder/default.cshtml se zobrazí následující:

Red

Yellow

Green

Spuštění inicializačního kódu pro všechny stránky ve složce

Pro soubory _PageStart.cshtml je vhodné inicializovat stejnou stránku rozložení pro všechny soubory v jedné složce.

  1. V kořenové složce vytvořte novou složku s názvem InitPages.

  2. Ve složce InitPages vašeho webu vytvořte soubor s názvem _PageStart.cshtml a nahraďte výchozí kód a kód následujícím kódem:

    @{
        // 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. V kořenovém adresáři webu vytvořte složku s názvem Sdílené.

  4. Ve složce Sdílené vytvořte soubor s názvem _Layout1.cshtml a nahraďte výchozí kód a kód následujícím kódem:

    @{
      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. Ve složce InitPages vytvořte soubor s názvem Content1.cshtml a nahraďte existující obsah následujícím kódem:

    <p>This is content page 1.</p>
    
  6. Ve složce InitPages vytvořte další soubor s názvem Content2.cshtml a nahraďte výchozí kód následujícím kódem:

    <p>This is content page 2.</p>
    
  7. Spusťte Content1.cshtml v prohlížeči.

    [Obrázek ukazuje spuštění content 1 tečky CSHTML v prohlížeči.]

    Při spuštění stránky Content1.cshtml se soubor _PageStart.cshtml nastaví Layout a také nastaví PageData["MyBackground"] na barvu. V souboru Content1.cshtml se použije rozložení a barva.

  8. Zobrazení obsahu Content2.cshtml v prohlížeči

    Rozložení je stejné, protože obě stránky používají stejnou stránku rozložení a barvu jako inicializované v souboru _PageStart.cshtml.

Zpracování chyb pomocí _PageStart.cshtml

Dalším vhodným využitím souboru _PageStart.cshtml je vytvoření způsobu zpracování programovacích chyb (výjimek), ke kterým může dojít na libovolné stránce .cshtml ve složce. Tento příklad ukazuje jeden ze způsobů, jak to udělat.

  1. V kořenové složce vytvořte složku s názvem InitCatch.

  2. Ve složce InitCatch vašeho webu vytvořte soubor s názvem _PageStart.cshtml a nahraďte existující kód následujícím kódem:

    @{
        try
        {
            RunPage();
        }
        catch (Exception ex)
        {
            Response.Redirect("~/Error.cshtml?source=" +
                HttpUtility.UrlEncode(Request.AppRelativeCurrentExecutionFilePath));
        }
    }
    

    V tomto kódu se pokusíte spustit požadovanou stránku explicitně voláním RunPage metody uvnitř try bloku. Pokud na požadované stránce dojde k chybám programování, spustí se catch kód uvnitř bloku. V tomto případě kód přesměruje na stránku (Error.cshtml) a jako součást adresy URL předá název souboru, u kterého došlo k chybě. (Stránku vytvoříte za chvíli.)

  3. Ve složce InitCatch vašeho webu vytvořte soubor s názvem Exception.cshtml a nahraďte existující kód a kód následujícím kódem:

    @{
        var db = Database.Open("invalidDatabaseFile");
    }
    

    Pro účely tohoto příkladu záměrně vytváříte chybu tím, že se pokusíte otevřít soubor databáze, který neexistuje.

  4. V kořenové složce vytvořte soubor s názvem Error.cshtml a nahraďte existující kód a kód následujícím kódem:

    <!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 této stránce výraz @Request["source"] získá hodnotu z adresy URL a zobrazí ji.

  5. Na panelu nástrojů klikněte na Uložit.

  6. V prohlížeči spusťte soubor Exception.cshtml .

    [Snímek obrazovky ukazuje spuštění výjimky tečka CSHTML v prohlížeči.]

    Protože v souboru Exception.cshtml dojde k chybě, stránka _PageStart.cshtml se přesměruje do souboru Error.cshtml , který zobrazí zprávu.

    Další informace o výjimkách najdete v tématu Úvod do ASP.NET programování webových stránek pomocí syntaxe Razor.

Použití _PageStart.cshtml k omezení přístupu ke složkách

Soubor _PageStart.cshtml můžete použít také k omezení přístupu ke všem souborům ve složce.

  1. V nástroji WebMatrix vytvořte nový web pomocí možnosti Web ze šablony .

  2. V dostupných šablonách vyberte Úvodní web.

  3. V kořenové složce vytvořte složku s názvem AuthenticatedContent.

  4. Ve složce AuthenticatedContent vytvořte soubor s názvem _PageStart.cshtml a nahraďte existující kód a kód následujícím kódem:

    @{
        Response.CacheControl = "no-cache";
        if (!WebSecurity.IsAuthenticated) {
            var returnUrl = "~/Account/Login?ReturnUrl=" + Request.Url.LocalPath;
            Response.Redirect(returnUrl);
        }
    }
    

    Kód začne tím, že zabrání ukládání všech souborů ve složce do mezipaměti. (To se vyžaduje ve scénářích, jako jsou veřejné počítače, kde nechcete, aby byly stránky uložené v mezipaměti jednoho uživatele dostupné pro dalšího uživatele.) Dále kód určuje, jestli se uživatel přihlásil k webu předtím, než může zobrazit některou ze stránek ve složce. Pokud uživatel není přihlášený, kód se přesměruje na přihlašovací stránku. Přihlašovací stránka může vrátit uživatele na původně požadovanou stránku, pokud zahrnete hodnotu řetězce dotazu s názvem ReturnUrl.

  5. Ve složce AuthenticatedContent vytvořte novou stránku s názvem Page.cshtml.

  6. Nahraďte výchozí kód následujícím kódem:

    @{
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Authenticated Content";
    }
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
      </head>
      <body>
        Thank you for authenticating!
      </body>
    </html>
    
  7. V prohlížeči spusťte soubor Page.cshtml . Kód vás přesměruje na přihlašovací stránku. Před přihlášením se musíte zaregistrovat. Po registraci a přihlášení můžete přejít na stránku a zobrazit její obsah.

Další materiály

Úvod do programování ASP.NET webových stránek pomocí syntaxe Razor