18 – úpravy chování s platností na celém webu

 
 

 

Tato kapitola vysvětluje, jak vytvářet nastavení, která mají dopad na celý web nebo celou složku, a ne pouze na jednu stránku.

Co se naučíte:

 

 

Přidání kódu prováděného při spuštění webu

Většina kódu je uvedena a většina nastavení nakonfigurována v jednotlivých stránkách. Pokud například stránka odesílá e-mailovou zprávu, pak tato stránka obvykle obsahuje veškerý kód potřebný pro inicializaci nastavení pro odesílání e-mailů (tedy pro server SMTP) a pro odeslání e-mailové zprávy.

V některých případech ale můžete chtít spustit určitý kód ještě předtím, než je spuštěna jakákoli stránka webu. To je užitečné pro nastavení hodnot, které mohou být použity kdekoli na webu (označovaných jako globální hodnoty.) Některé pomocné třídy vyžadují, abyste jim poskytli hodnoty jako například nastavení e-mailu nebo klíče účtů, a je praktické uchovávat tato nastavení jako globální hodnoty.

To je možné provést vytvořením stránky s názvem _AppStart.cshtml v kořenové složce webu. Pokud tato stránka existuje, je spuštěna v okamžiku, kdy je poprvé vyžádána libovolná stránka na webu. Proto představuje dobré místo pro spuštění kódu, který slouží k nastavení globálních hodnot. (Protože předponu názvu stránky _AppStart.cshtml tvoří podtržítko, ASP.NET tuto stránku nezašle prohlížeči, a to ani v případě, že si ji uživatelé přímo vyžádají.)

Následující diagram znázorňuje, jak stránka _AppStart.cshtml funguje. Když přijde požadavek na stránku a jedná se o první požadavek na libovolnou stránku na daném webu, ASP.NET nejprve ověří, zda existuje stránka _AppStart.cshtml. Pokud ano, je proveden veškerý kód ve stránce _AppStart.cshtml a poté je spuštěna požadovaná stránka.

kap18přizpůsobeníwebu-1

Nastavení globálních hodnot webu

  1. V kořenové složce webu prostředí WebMatrix vytvořte soubor s názvem _AppStart.cshtml. Soubor musí být umístěn v kořenové složce webu.
  2. Výchozí kód značkovacího jazyka a programový kód nahraďte následujícím kódem:
    @{ 
      AppState["customAppName"] = "Application Name"; 
    }

    Tento kód ukládá hodnotu ve slovníku AppState, který mají automaticky k dispozici všechny stránky webu.

    Poznámka   Dávejte si pozor na to, jaký kód do stránky _AppStart.cshtml vložíte. Pokud v kódu v souboru _AppStart.cshtml nastane libovolná chyba, web se nespustí.
  3. V kořenové složce vytvořte novou stránku s názvem AppName.cshtml.
  4. Výchozí kód značkovacího jazyka a programový kód nahraďte 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 získá hodnotu ze slovníku AppState, která byla nastavena ve stránce _AppStart.cshtml.

  5. Spusťte stránku AppName.cshtml v prohlížeči. (Před jejím spuštěním ověřte, zda je stránka vybrána v pracovním prostředí Files – Soubory.) Stránka zobrazí globální hodnotu.

    kap18přizpůsobeníwebu-2

Nastavení hodnot pro pomocné třídy

Soubor _AppStart.cshtml můžete s výhodou použít k nastavení hodnot pro pomocné třídy, které na svém webu používáte a které musí být inicializovány. Výborným příkladem je pomocná třída (helper) ReCaptcha, pro kterou je nutné určit veřejný a privátní klíč účtu služby reCAPTCHA. Místo toho, abyste tyto klíče nastavovali na každé stránce, na které chcete pomocnou třídu ReCaptcha použít, můžete je nastavit jednou v souboru _AppStart.cshtml, a tím je nastavit pro všechny stránky na webu. Mezi další hodnoty, které můžete v souboru _AppStart.cshtml nastavit, patří například nastavení pro odesílání e-mailů prostřednictvím serveru SMTP, jak jste viděli v kapitole 16 – Přidání zabezpečení a členství.

Tento postup ukazuje, jak globálně nastavit klíče pro pomocnou třídu ReCaptcha. (Další informace o použití pomocné třídy ReCaptcha najdete v kapitole 16 – Přidání zabezpečení a členství.)

  1. Pokud jste ji ještě nepřidali, přidejte na svůj web knihovnu pomocných webových tříd ASP.NET tak, jak popisuje kapitola 1.
  2. Pokud jste jej ještě nezaregistrovali, zaregistrujte svůj web na webu služby ReCaptcha.Net (http://recaptcha.net). Po dokončení registrace získáte veřejný a privátní klíč.
  3. Pokud ještě soubor _AppStart.cshtml nemáte, vytvořte soubor s názvem _AppStart.cshtml v kořenové složce webu.
  4. Stávající kód v souboru _AppStart.cshtml nahraďte následujícím kódem:
    @{ 
      // Přidání řetězců PublicKey a PrivateKey obsahujících váš veřejný 
      // a privátní klíč. Hodnoty pro řetězce PublicKey a PrivateKey získáte
        
    // na webu ReCaptcha.Net (http://recaptcha.net).
       ReCaptcha.PublicKey = "";   
      ReCaptcha.PrivateKey = "";   
    }
  5. Vlastnosti PublicKey (Veřejný klíč) a PrivateKey (Privátní klíč) nastavte s použitím svého vlastního veřejného a privátního klíče.
  6. Soubor _AppStart.cshtml uložte a zavřete.
  7. V kořenové složce webu vytvořte novou stránku s názvem Recaptcha.cshtml.
  8. Výchozí kód značkovacího jazyka a programový kód nahraďte následujícím kódem:
    @{ 
      var showRecaptcha = true; 
      if (IsPost) {   
        if (ReCaptcha.Validate()) {   
            @:Your response passed! 
            showRecaptcha = false; 
        } 
        else{ 
          @:Your response didn't pass!   
        }   
      }   
    } 
    <!DOCTYPE html> 
    <html> 
        <head> 
            <title>Testing Global Recaptcha Keys</title> 
        </head> 
        <body> 
        <form action="" method="post"> 
        @if(showRecaptcha == true){ 
            if(ReCaptcha.PrivateKey != ""){ 
                <p>@ReCaptcha.GetHtml()</p> 
                <input type="submit" value="Submit" /> 
            } 
            else { 
                <p>You can get your public and private keys at  
                the ReCaptcha.Net website (http://recaptcha.net).  
                Then add the keys to the _AppStart.cshtml file.</p> 
            } 
        } 
        </form> 
        </body> 
    </html>
  9. Spusťte stránku Recaptcha.cshtml v prohlížeči. Pokud vlastnost PrivateKey (Privátní klíč) obsahuje platnou hodnotu, na stránce bude zobrazen ovládací prvek reCAPTCHA a tlačítko. Pokud by klíče nebyly globálně nastaveny v souboru _AppStart.html, stránka by zobrazila chybu.

    kap18přizpůsobeníwebu-3

  10. Zadejte vyžadovaná slova testu. Pokud jste test reCAPTCHA splnili, uvidíte zprávu s potvrzením této skutečnosti. V opačném případě uvidíte chybovou zprávu a bude znovu zobrazen ovládací prvek reCAPTCHA.

Spuštění kódu před spuštěním stránek ve složce a po něm

Stejně jako je možné v souboru _AppStart.cshtml uvést kód, který je proveden předtím, než jsou spuštěny stránky na webu, můžete také vytvořit kód, který je proveden před spuštěním libovolné stránky v určité složce (a po něm). Pomocí tohoto postupu je s výhodou možné provádět takové operace, jako je například nastavení stejné stránky s rozložením pro všechny stránky ve složce nebo ověření toho, že uživatel je přihlášen, před spuštěním stránky ve složce.

Pro stránky v určité složce je možné vytvořit kód v souboru s názvem _PageStart.cshtml. Následující diagram znázorňuje, jak stránka _PageStart.cshtml funguje. Když přijde požadavek na stránku, ASP.NET nejprve zkusí najít stránku _AppStart.cshtml a spustí ji. Poté ASP.NET ověří, jestli existuje stránka _PageStart.cshtml, a pokud ano, spustí ji. Poté spustí požadovanou stránku.

Uvnitř stránky _PageStart.cshtml můžete určit, kdy během zpracování má být stránka spuštěna, pomocí metody RunPage (Spustit stránku). Můžete tak kód spustit před spuštěním požadované stránky, a poté znovu po něm. Pokud metodu RunPage (Spustit stránku) neuvedete, bude proveden veškerý kód na stránce _PageStart.cshtml a poté bude automaticky spuštěna požadovaná stránka.

kap18přizpůsobeníwebu-4

ASP.NET umožňuje vytvářet hierarchie souborů _PageStart.cshtml. Soubor _PageStart.cshtml je možné umístit do kořenové složky webu a také do libovolné podsložky. Po vyžádání stránky je spuštěn soubor _PageStart.cshtml na nejvyšší úrovni (nejblíže kořenu webu), po něm následuje soubor _PageStart.cshtml v další podsložce a vykonávání postupně prochází dolů strukturou podsložek, až požadavek dorazí do složky obsahující požadovanou stránku. Po vykonání všech příslušných souborů _PageStart.cshtml je spuštěna požadovaná stránka.

Na webu můžete mít například následující kombinaci souborů _PageStart.cshtml a soubor 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 spuštění stánky default.cshtml bude zobrazen následující text:

Red

Yellow

Green

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

Příkladem vhodného způsobu použití souborů _PageStart.cshtml je inicializace stejné stránky s rozložením pro všechny soubory v jedné složce.

  1. V kořenové složce vytvořte novou složku s názvem InitPages (Inicializace stránek).
  2. Ve složce InitPages na webu vytvořte soubor s názvem _PageStart.cshtml a výchozí kód značkovacího jazyka a programový kód nahraďte následujícím kódem:
    @{ 
        
    // Nastavení stránky s rozložením pro všechny stránky ve složce
         Layout = "/Shared/_Layout1.cshtml";  
        
    // Nastavení proměnné, která bude k dispozici na všech stránkách ve složce
         PageData["MyBackground"] = "Yellow"; }
  3. V kořenové složce webu vytvořte novou složku s názvem Shared (Sdílené).
  4. Ve složce Shared vytvořte soubor s názvem _Layout1.cshtml a výchozí kód značkovacího jazyka a programový kód nahraďte 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"> 
      © 2010 Contoso. All rights reserved 
    </div> 
    </body> 
    </html>
  5. Ve složce InitPages vytvořte soubor s názvem Content1.cshtml a výchozí kód značkovacího jazyka nahraďte 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 výchozí kód značkovacího jazyka nahraďte následujícím kódem:
    <p>This is content page 2.</p>
  7. Spusťte stránku Content1.cshtml v prohlížeči.

    kap18přizpůsobeníwebu-5

    Po spuštění stránky Content1.cshtml soubor _PageStart.cshtml nastaví vlastnost Layout (Rozložení) a také nastaví položku PageData["MyBackground"] na určitou barvu. Na stránce Content1.cshtml je použito toto rozložení a barva.

  8. Zobrazte stránku Content2.cshtml v prohlížeči.

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

Zpracování chyb s použitím souboru_PageStart.cshtml

Dalším příkladem vhodného způsobu použití souboru _PageStart.cshtml je vytvoření metody pro zpracování chyb programového kódu (výjimek), které mohou nastat na libovolné stránce CSHTML v určité složce. Tento příklad ukazuje jeden způsob, jak je to možné provést.

  1. V kořenové složce vytvořte složku s názvem InitCatch (Inicializace bloku catch).
  2. Ve složce InitCatch na webu vytvořte soubor s názvem _PageStart.cshtml a stávající kód značkovacího jazyka a programový kód nahraďte následujícím kódem:
    @{  
        try 
        { 
            RunPage(); 
        } 
        catch (Exception ex) 
        { 
            Response.Redirect("/Error.cshtml?source=" +  
                HttpUtility.UrlEncode(Request.AppRelativeCurrentExecutionFilePath)); 
        } 
    }

    V tomu kódu se pokoušíme stránku explicitně spustit pomocí volání metody RunPage (Spustit stránku) uvnitř bloku try. Pokud na požadované stránce dojde k libovolné chybě programu, je vykonán kód uvnitř bloku catch. V tomto případě kód provede přesměrování na jinou stránku (Error.cshtml) a jako součást adresy URL předá název souboru, ve kterém k chybě došlo. (Tuto stránku brzy vytvoříme.)

  3. Ve složce InitCatch na webu vytvořte soubor s názvem Exception.cshtml a stávající kód značkovacího jazyka a programový kód nahraďte následujícím kódem:
    @{  
        var db = Database.Open("invalidDatabaseFile"); 
    }

    Na této stránce pro účely tohoto příkladu úmyslně vytváříme chybu tím, že se snažíme otevřít neexistující databázový soubor.

  4. V kořenové složce vytvořte soubor s názvem Error.cshtml a výchozí kód značkovacího jazyka a programový kód nahraďte 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 je hodnota z adresy URL získána a zobrazena pomocí kódu @Request["source"].

  5. Na panelu nástrojů klikněte na ikonu Save (Uložit).
  6. Spusťte stránku Exception.cshtml v prohlížeči.

    kap18přizpůsobeníwebu-6

    Protože na stránce Exception.cshtml dojde k chybě, stránka _PageStart.cshtml provede přesměrování na soubor Error.cshtml, který zobrazí chybovou zprávu.

    Další informace o výjimkách získáte v kapitole 2 – úvod do programování webů ASP.NET s použitím syntaxe Razor.

Omezení přístupu ke složce pomocí souboru _PageStart.cshtml

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

  1. Vytvořte nový web s použitím možnosti Site From Template (Web ze šablony).
  2. Z nabízených šablon vyberte šablonu Starter Site (Počáteční web).
  3. V kořenové složce vytvořte složku s názvem AuthenticatedContent (Obsah pro ověřené uživatele).
  4. Ve složce AuthenticatedContent vytvořte soubor s názvem _PageStart.cshtml a stávající kód značkovacího jazyka a programový kód nahraďte následujícím kódem:
    @{ 
        Response.CacheControl = "no-cache"; 
     
        if (!WebSecurity.IsAuthenticated) {  
            Response.Redirect("/Account/Login");  
        } 
    }

    Kód začíná tím, že zamezí uložení libovolného souboru ve složce do mezipaměti. (Tento přístup je vyžadován v situacích, jako je například použití veřejných počítačů, kdy je nežádoucí, aby stránky jednoho uživatele uložené do mezipaměti byly přístupné dalšímu uživateli, který bude počítač používat po něm.) V dalším kroku kód zjistí, zda se uživatel k webu přihlásil, než bude moci prohlížet libovolnou stránku ve složce. Pokud se uživatel nepřihlásil, kód jej přesměruje na přihlašovací stránku.

  5. Ve složce AuthenticatedContent vytvořte novou stránku s názvem Page.cshtml.
  6. Výchozí kód značkovacího jazyka nahraďte 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. Spusťte stránku Page.cshtml v prohlížeči. 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í budete moci na stránku přejít a zobrazit její obsah.

Vytvoření čitelnějších adres URL, které lze snáze prohledávat

Adresy URL stránek na webu mohou mít vliv na to, jak dobře web funguje. „Uživatelsky přívětivé“ adresy URL návštěvníkům usnadňují používání webu. Mohou také pomoci s optimalizací vyhledávací služby pro daný web. Weby ASP.NET poskytují možnost automatického používání uživatelsky přívětivých adres URL.

Směrování

ASP.NET umožňuje vytvářet smysluplné adresy URL, které se pouze neodkazují na soubory na webu, ale popisují akce prováděné uživateli. Porovnejte tyto páry adres URL fiktivního blogu:

http://www.contoso.com/Blog/blog.cshtml?categories=hardware
http://www.contoso.com//Blog/blog.cshtml?startdate=2009-11-01&enddate=2009-11-30

http://www.contoso.com/Blog/categories/hardware/
http://www.contoso.com/Blog/2009/November

U prvních dvou párů by uživatel musel vědět, že blog je zobrazen s použitím stránky blog.cshtml a poté by musel vytvořit řetězec dotazu, pomocí něhož by získal správnou kategorii nebo datové rozmezí. Druhý pár příkladů lze mnohem snáze pochopit a vytvořit.

Adresy URL v prvních dvou příkladech se také odkazují přímo na konkrétní soubor (blog.cshtml). Pokud by z nějaké důvodu byl blog přesunut do jiné složky na serveru nebo přepsán s použitím jiné stránky, odkazy by přestaly platit. Druhá sada adres URL se neodkazuje na konkrétní stránku, a proto i pokud by se změnila implementace blogu nebo jeho umístění, adresy URL by stále zůstaly platné.

Technologie ASP.NET umožňuje vytvářet uživatelsky přívětivější adresy URL, jako ve výše uvedených příkladech, díky tomu, že používá směrování. Směrování vytváří logické mapování adresy URL na stránku (nebo stránky), které mohou požadavek vyplnit. Protože mapování je logické (a ne fyzické, odkazující se na konkrétní soubor), směrování poskytuje větší flexibilitu pro definici adres URL webu.

Jak směrování funguje

Technologie ASP.NET při zpracování požadavku přečte adresu URL a určí, jak ji je možné směrovat. ASP.NET zkusí porovnat jednotlivé části adresy URL se soubory na disku a postupuje přitom zleva doprava. Pokud najde shodu, celá zbývající část adresy URL je stránce předána jako informace o cestě. Představte si například následující strukturu složek na webu:

kap18přizpůsobeníwebu-7

A představte si, že někdo zašle požadavek s použitím této adresy URL:

http://www.contoso.com/a/b/c

Vyhledávání bude probíhat takto:

  1. Existuje soubor, jehož cesta a název je /a/b/c.cshtml? Pokud ano, je tento soubor spuštěn a nejsou mu předány žádné informace. V opačném případě...
  2. Existuje soubor, jehož cesta a název je /a/b.cshtml? Pokud ano, je tento soubor použit a jsou mu předány informace c. V opačném případě...
  3. Existuje soubor, jehož cesta a název je /a.cshtml? Pokud ano, je tato stránka spuštěna a jsou jí předány informace b/c.

Pokud při vyhledávání nejsou pro soubory CSHTML v určených složkách nalezeny žádné přesné shody, ASP.NET pokračuje ve vyhledávání následujících souborů v tomto pořadí:

  1. /a/b/c/default.cshtml (žádné informace o cestě)
  2. /a/b/c/index.cshtml (žádné informace o cestě)
Poznámka   Připomínáme, že žádosti o konkrétní stránky (tedy žádosti obsahující příponu souboru CSHTML) fungují zcela podle očekávání. Žádost typu http://www.contoso.com/a/b.cshtml spustí stránku b.cshtml zcela bez problémů.

Uvnitř stránky je možné získat informace o cestě prostřednictvím vlastnosti UrlData, která je implementována jako slovník. Představte si, že máte soubor s názvem ViewCustomers.cshtml a váš web obdrží takovýto požadavek:

http://mysite.com/myWebSite/ViewCustomers/1000

Podle výše popsaných pravidel bude tento požadavek doručen vaší stránce. Na stránce můžete pomocí podobného kódu jako v následujícím příkladu získat a zobrazit informace o cestě (v tomto případě hodnotu "1000"):

<!DOCTYPE html> 
<html> 
    <head> 
        <title>URLData</title> 
    </head> 
    <body> 
ID zákazníka: @UrlData[0].ToString() 
    </body> 
</html>
Poznámka   Protože směrování nepoužívá úplné názvy souborů, může dojít k nejasnostem, pokud existují stránky se stejným názvem, ale odlišnou příponou názvu souboru (například MyPage.cshtmlMyPage.html). Nejlepším způsobem, jak se vyhnout problémům při směrování, je nepoužívat na webu stránky, jejichž názvy se liší pouze příponou.

Další materiály

Referenční příručka pro webové stránky ASP.NET se syntaxí Razor