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:
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.
@{ AppState["customAppName"] = "Application Name"; }
Tento kód ukládá hodnotu ve slovníku AppState, který mají automaticky k dispozici všechny stránky webu.
<!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.
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í.)
@{ // 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 = ""; }
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. @{ 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>
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.
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.
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
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.
@{ // 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"; }
@{ 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>
<p>This is content page 1.</p>
<p>This is content page 2.</p>
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.
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.
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.
@{ 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.)
@{ 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.
<!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"].
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.
Soubor _PageStart.cshtml můžete použít také k omezení přístupu ke všem souborům ve složce.
@{ 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.
@{ Layout = "/_SiteLayout.cshtml"; Page.Title = "Authenticated Content"; } <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> Thank you for authenticating! </body> </html>
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.
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.
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:
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:
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í:
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>